01 février 2011

Hudson et Jenkins sont dans un bateau ...

C'est chose faite, la communauté des développeurs Hudson a choisi de quitter définitivement Oracle et de forker / renommer (tout dépend du point de vue) le projet en Jenkins (http://www.jenkins-ci.org).



Les choses sont déjà suffisamment compliquées, voici que Sonatype prend position et apporte son soutien ... à Oracle Hudson :
"

One problem that we've encountered frequently in the past with Hudson
is stability after upgrades.  

This will be one of the areas of primary focus for Sonatype and when the rename happens 
today we will begin the process of merging most of our stabilization work back to Hudson. 
`This will take a bit of time because we stepped off the train to decide how and who we 
wanted to continue working with. I think this whole situation is unfortunate, but ultimately 
Kohsuke has the right, like everyone else, to do what he feels is right. I honestly do not 
believe what has happened is in the best interest of users, but this is my opinion and only 
time will tell.

If anyone is interested in the work to be done on Hudson the java.net lists should be up, the 
@hudsonci twitter account will be very active, and I'll have a series of blog posts about the 
work Sonatype is planning to contribute, a critique of the current architecture, and proposed 
roadmap. While I'm sure we're not going to be very popular in the short term, continuing the 
Hudson with Oracle is what we feel is best. Our goals and motives have not changed since 
the first time I posted about Sonatype's potential involvement. We care about the IP, the 
provenance of the code, the stability of the core, helping to create a new architecture while 
maintaining backward compatibility, create great Maven integration and create a commercial 
product. We've done a lot of work for enterprise users and we hope to share this with the 
Hudson community as soon as we can.

I believe it is truly regrettable what has happened, but life goes on and I'm sure both projects 
will do well catering to their users.

"

Jason met le doigt sur un élément clé : la stabilité et l'architecture de Hudson. C'est un critère important pour son utilisation en entreprise sur des projets stratégiques. Il faut reconnaitre que le modèle de développement de Hudson est particulièrement ouvert et manque parfois d'un cadre strict. Cela n'a pas empêché le projet de progresser très vite et de s'enrichir de fonctionnalités avancées, et ça a toujours été une volonté affichée pour réduire au minimum la barrière de contribution. Par contre, ça peut ne pas rassurer un DSI (vous me direz, c'est le même qui a commandé des licences Websphere 7, mais bon ...).

L'offre Sonatype Profesionnal intègre un Hudson validé et supporté ("Matrix"), il ne fait donc aucun doute que Sonatype a des évolutions techniques à proposer pour stabiliser et améliorer le projet. Devant le vide laissé par le départ de la communauté des développeurs pour Jenkins, ils vont ainsi se retrouver premier contributeur au côté d'Oracle, une place de project-lead inespérée.

Evidemment, rien n'est gagné : la communication autour du changement de nom a été large et Jenkins va continuer d'avancer au rythme qu'on lui connait. D'un autre côté, les clients d'Oracle ou de Sonatype seront sensibles à l'argumentaire de qualité technique et de stabilité d'un élément clé de leur forge logicielle. Sonatype va donc devoir mettre les bouchées doubles pour démontrer une plus-value et sa capacité à améliorer Hudson. Jenkins étant contraint de conserver les APIs existantes, les nombreux plugins ne sont pas remis en cause (dans l'immédiat), aussi Sonatype va pouvoir se focaliser sur le coeur Hudson et sur une intégration Maven 2/3 particulièrement poussée. Le niveau technique des développeurs ne fait aucun doute, tout va donc se jouer dans le timing et l'art de communiquer auprès de la communauté d'utilisateurs.

Pas facile de prédire ce que cela va donner... en espérant que ça ne va pas tourner au troll "audit de code" ou que sais-je pour démontrer qu'un projet est techniquement supérieur à l'autre.

On vit une époque formidable.

27 janvier 2011

"Mavenizer" un projet

Lorsqu'on cherche à convertir un projet "old-school" sous Maven, l'une des premières tâches consiste à identifier la liste de dépendances du projet. On peut se baser sur le nom des JAR, éventuellement se rassurer en inspectant le fichier MANIFEST (lorsqu'il est renseigné), mais en général c'est :

  • long
  • barbant
  • peu fiable : j'ai déjà vu des JAR "patchés" ou "complétés" avec des classes annexes

Une solution plus propre consiste à se baser sur les empruntes MD5 et SHA1 que le repository Maven conservent pour chaque artefact. Une simple recherche Google sur cette clé retourne l'identification précise d'une bibliothèque (avec parfois des surprises !).

Il y a pourtant encore plus simple...

Le repository manager Nexus propose un moteur de recherche qui prend en entrée l'emprunte SHA1. Basé sur son index interne, il va nous retrouver la bibliothèque, et en plus nous indiquer les versions plus récentes (si on veut en profiter pour un petit lifting). L'avantage de Nexus, c'est qu'il propose une API REST qui permet d'automatiser tout ça. Allons-y donc gaillardement !

J'écrit donc mon tout premier script Ruby ! - et oui, tout fout le camp ma bonne dame - ce langage est génial pour écrire des scripts de ce type, avec des bibliothèques bien puissantes ;)

require 'find'
require 'digest/sha1'
require 'net/http'
require 'rexml/document'
include REXML

for file in Dir.glob("*.jar") do 
    sha = Digest::SHA1.file( file ).hexdigest
    url = "http://myNexus/service/local/lucene/search?sha1=" + sha 
    resp = Net::HTTP.get_response( URI.parse( url ) )
    puts File.basename( file ) + " (" + sha + ") = \n";
    doc = REXML::Document.new( resp.body )
    XPath.each( doc, "//artifact" ) do |r|
          puts "<dependency>"
          puts "   <groupId>#{r.elements["groupId"].text}</groupId>"
          puts "   <artifactId>#{r.elements["artifactId"].text}</artifactId>"
          puts "   <version>#{r.elements["version"].text}</version>"
          puts "</dependency>"
    end  
 
end
Rien de bien méchant, comme vous pouvez le constater, et ce script permet d'analyser rapidement une liste de jar en proposant les éléments à intégrer dans le POM. Il restera "juste" à identifier les bibliothèques qui seront passées entre les mailles du filet.

Maintenant que Maven Indexer est un projet Apache (depuis la version 3.1.0), ce serait bien d'intégrer cette fonctionnalité au plugin dependency [MDEP-269] ... ou ailleurs.

26 janvier 2011

2011, l'année du fork

2011 pourrait bien être l'année du fork.


Non, je ne parle pas du nouvel an chinois, mais de la scission d'une communauté open-source (fork).

Le premier va se dérouler du côté du serveur d'intégration continue Hudson.
Après avoir géle puis migré le projet (sans prévenir) de l'infrastructure java.net vers kenai, Oracle réclame aujourd'hui le pilotage du projet, ou en tout cas l'application de règles strictes de pilotage et de cession des droits sur les contributions. La communauté ne suit pas, prise depuis le début à rebrousse-poil, et a déjà migré sur gitHub et google-groups.

Les dernières tentatives d'accord pour trouver un arrangement acceptable, légitimant une communauté indépendante sans couper les ponts avec Oracle, ne progressent pas. On s'oriente donc à grand pas vers un changement de nom pour Hudson (la seule chose qu'Oracle possède encore c'est ... ce nom "hudson ®") qui deviendra Jenkins.

La communauté Hudson - légitime en terme de lignes de code - se retrouve donc face à Oracle qui ne lâche pas grand chose, fort de sa légitimité sur le nom "hudson" et l'historique du projet.

Le second pourrait se dérouler du côté de Maven. 
Critiqué pour son pilotage unilatéral du projet au travers de sa société Sonatype, Jason Van Zyl a claqué la porte du Project Management Committee Maven. Fondateur du projet, il ne participe donc plus à ces discussions (qui a dit "disputes" ?) et continue à bosser avec ses collègues sur l'outil qui fait vivre sa boite, mais sur gitHub plutôt que dans le SVN Apache. Le code reste opensource, accessible à tous, mais ne suit plus les règles de bonne conduite communautaire édictées par la fondation. Sans a priori sur les personnalités en présence, ce n'est pas la première fois qu'un leader se plaint du modèle Apache et finit par aller voir ailleurs [1].

Les raisons de la crise : une partie non négligeable de Maven (Aether) est désormais hébergée chez Sonatype, et bien que toujours opensource, est vécue par certains contributeurs Maven comme une perte de contrôle (nécessité de signer une CLA pour contribuer). Comme pour ajouter à la sauce, Modello et Plexus, deux projets "socle" de Maven, ont été déplacés sur le gitHub Sonatype puis fermés sur codehaus.

Jusqu'ici les échanges liés à ces frictions sont restés discrets, la fondation Apache ayant pour règle de gérer ce genre de conflit en privé. Avec la contribution de Sonatype dans la fondation Eclipse via le projet m2eclipse, un changement de license [2] sur un composant a ébruité publiquement la situation.

Il ne s'agit pas (encore) d'un fork, mais rien n'interdit à Sonatype de publier ses propres releases de Maven (mais pas Apache Maven) dans le cade de son offre Sonatype Professional, le nom n'étant pas déposé par la fondation. Le PMC doit donc trouver un compromis, définir des règles sur l'utilisation de ces composants "externes" qui constituent pourtant une part importante de Maven 3 (core), et voir comment intégrer les développements de Sonatype tout en conservant un pilotage à la Apache du projet et en continuant à assurer la maintenance des nombreux plugins qui - eux - restent un terrain de jeu équitable pour tous les contributeurs (les moins doués se contentant d'écrire des bouquins sur le sujet).

La communauté Apache Maven - légitime en terme de contribution historique et de support - se retrouve donc face à Sonatype, fort de sa légitimité sur la quasi-totalité du travail de développement de Maven 3.

Inutile de vous dire à quel point ces querelles de légitimité, de licence, de règles de pilotage sont à la fois passionnantes et barbantes pour les contributeurs qui passent un temps fou à éplucher les mailing-list abreuvées de messages enflammés. 2011 risque de ne pas être une année reposante.




[1] le développement de log4j 1.3 est quasi abandonné, englué dans des discussions sur le maintien de la compatibilité. Ceki Güclü a préféré reprendre à 0 avec l'excellent slf4j.
[2] https://github.com/sonatype/sisu, notez les deux fichiers LICENCE.txt. Sous licence EPL, le code associé n'a plus aucune chance de revenir à la fondation

09 janvier 2011

Apple, 3 mos plus tard

Il y a trois mois, je sacrifiais mon compte en banque pour commander un MacBookPro. Le refurb a même réussi à me faire croire que je faisais une économie en ne lâchant "que" 1700€... 3 mois après, que donne la migration de l'OS aux fenêtres vers celui aux pommes ? Je vous donne ça un peu en vrac, faites le tri :

MacOS est un environnement magnifique, avec de nombreux raffinements auxquels on s'habitue bien vite. Si on met évidemment un petit moment pour trouver ses marques, il se prend en main rapidement (bien plus vite qu'un Linux pour avoir déjà testé). Par contre, la légende du "tout marche out-of-the-box" est largement sur-estimée. Si on part avec un système bien plus complet que lorsqu'on vient d'installer un Windows et qu'on a tout juste un notepad, il reste bien des softs à chercher sur le Net pour compléter le système, et diverses magouilles à trouver pour tout mettre au clair. Google est ton amis, et on s'en sort tout de même assez vite.

Ces détails de prise en main réglés, le système est comme promis extrêmement stable (j'ai rebooté 3 fois depuis octobre ...) et très performant. Il faut que je lance l'encodage vidéo pour le breizhjug pour constater les syndrome du système chargé à bloc et les freeze qui vont avec (sachant que je n'ai pas cherché à limiter le processus).

Côté dev, j'ai profité de l'occasion pour passer à Idea, et pour le reste travailler sur un système type-Unix est bien appréciable. Tous les outils en ligne de commande sont présents (ou disponibles sous forme de MacPort) et on oublie les problèmes d'encodage ou de format EOL qui pénalisent toujours les environnements Windows.

MacOS est donc un environnement bien agréable, aussi bien en tant qu'utilisateur que comme développeur. Il n'en reste pas moins qu'il s'agit d'une prison dorée : rien que pour raccorder le portable à un écran externe (fonctionnalité de fou-fou) compter 29€ d'accessoire (c'est sur, un connecteur HDMI aurait dénaturé la machine). Idem pour l'extension vendue 20€ permettant de lire des fichiers MPEG avec Quicktime. Pas de doute, Apple est avant tout la fusion parfaitement réussie entre le design et le marketing. Si vous ne l'aviez pas compris en constant le prix des machines, préparez le porte-monnaie ! Bien sûr, on trouve quelques (très bons) softs opensource ou freeware pour Mac, mais ça reste un marché bien plus confidentiel. Si les softs natifs macos sont généralement aussi bien léchés que le système, le manque de choix est parfois regrettable.

Préparez-vous aussi à devoir subir les changements de politique de Steeve. On m'avait par exemple vanté les mérites d'un système qui intègre de base Java et Maven, 15jours plus tard Apple passait l'éponge sur sa JVM pour rallier OpenJDK (ou plutôt, laisser à OpenJDK le soin de combler le vide ainsi créé). On peut pour l'instant encore installer ses softs sans passer par l'Apple Store, mais qu'en sera t-il de la prochaine release ?

Soyons clairs, mon PC reste allumé uniquement pour OutLook parce que je n'ai pas réussi à accéder à ma messagerie Exchange. Cependant, je ne pense pas que le Mac soit la solution ultime pour les développeurs. Cela reste un système fermé, piloté par la vision d'un gars connu pour ses retournements de veste (demandez à ceux qui ont un Mac PowerPC), exploitant son image haut de gamme et son avance en terme de design et d'ergonomie pour justifier des tarifs doubles de la concurrence. Nous autres développeurs sommes une minorité dans le pannel des clients Apple (comparé au monde de la photo ou de la PAO par exemple), aussi le système a plus de chance de s'orienter vers du tout sous contrôle que vers de la machine de geek.

Linux est malheureusement (?) trop dispersé pour jouer sur le même front, mais reste une solution à considérer pour tirer les mêmes bénéfices en tant que développeur - à condition de ne pas avoir besoin de la suite MS Office.

Moralité : si on vous propose un Mac dans le cadre de votre boulot, c'est un réel avantage, et pas uniquement un attrape-geek. Par contre, si vous voulez juste quitter le monde Windows et devez sortir les 2000€ facturés par Apple de votre poche, regardez aussi ce qui se fait alentour avant de signer...

06 janvier 2011

RPC/Encoded avec JAX-WS

A l'époque ou SUN a voulu faire prendre à Java le train des services web, le JCP a accouché de JAX-RPC. Nous avons été nombreux à choisir l'implémentation Apache Axis pour exposer ou consommer de tels services.

Mauvaise pioche, le "marché" a par la suite adopté l'approche document, alors que JAX-RPC était un RMI pour les services web, basé sur l'approche RPC. Pour la version 2.0 de la norme, le JCP a changé son fusil d'épaule et créé JAX-WS, norme qui exclue le mode RPC/Encoded et repose sur JAXB.

Voilà pour l'historique. Aujourd'hui, que vous choisissiez Metro, JbossWSAxis2 ou Apache CXF (mon préféré), vous  partez sur une stack web-services éprouvée et interopérable ... jusqu'à ce qu'un partenaire vous expose un vieux WSDL bien naze en RPC/Encoded.

Un réflexe que j'ai constaté plusieurs fois dans ces circonstances consiste à déterrer Axis pour communiquer avec ce service web façon grand-mère. Autrement dit, partir sur un outil qui n'a plus évolué depuis 5 ans, abandonné par ses développeurs au profit d'Axis2 et ... techniquement discutable (pour avoir du déboguer un problème de namespace dedans, je vous déconseille d'essayer)

Si la norme JAX-WS exclue le support du mode RPC/Encoded, cela ne signifie pas qu'il est impossible d'invoquer un service de ce type. On peut toujours exploiter notre pile web-services, incluant ses mécanismes de sécurité, de gestion de ressources, de log et monitoring, etc. Par contre on ne bénéficiera pas des mécanisme de binding entre le flux XML et du code Java généré.

Le moyen le plus simple que j'ai trouvé (je suis ouvert à toutes suggestion) est de construire à la main la trame de requête (utiliser SoapUi pour avoir une base valide), à l'aide d'un mécanisme de template, puis d'aller piocher les éléments du flux de réponse via son arbre DOM. Ca donne ça :

// Construction de la trame requête, 
// utiliser un mécanisme de template style freemarker si besoin
String request = "<soapenv:Envelope "
  + " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "
  + " xmlns:xsd='http://www.w3.org/2001/XMLSchema' "
  + " xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' "
  + " xmlns:urn='urn:Naze'>"
  + "<soapenv:Header/>"
  + "<soapenv:Body>"
  + "  <urn:foo soapenv:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>"
  + "    <id xsi:type='xsd:string'>42</id>"
  + "    <query xsi:type='xsd:string'>ndeloof</query>"
  + "  </urn:foo>"
  + "</soapenv:Body>"
  + "</soapenv:Envelope>";

// Un peu de manipulation des API XML, désolé
QName serviceName = new QName( "urn:Naze", "NazeService" );
QName portName = new QName( "urn:Naze", "NazePort" );
Service service = Service.create( getWSDL(), serviceName );

// Utilisation de l'API de niveau "message" de JAX-WS pour transférer le message
Dispatch dispatch = 
   service.createDispatch( portName, Source.class, Service.Mode.MESSAGE );
dispatch.getRequestContext().put( 
   BindingProvider.USERNAME_PROPERTY, "login" );
dispatch.getRequestContext().put( 
   BindingProvider.PASSWORD_PROPERTY, "password" );
Source response = dispatch.invoke( 
   new StreamSource( new StringReader( request ) ) );

MessageFactory msgFactory = MessageFactory.newInstance();
SOAPMessage msg = msgFactory.createMessage();
SOAPPart env = msg.getSOAPPart();
env.setContent( request );

if ( msg.getSOAPBody().hasFault() )
  throw new RemoteAccessException( "oups..." );

// récupération des éléments XML qui nous intéressent
NodeList arrayOfString = 
  msg.getSOAPBody().getElementsByTagName( "result" );
Node node = arrayOfString.item( 0 );
return node.getTextContent();

Je vous accorde que c'est un peu laborieux ;)

Une autre solution, plus légère mais moins portable, consiste à appeler Spring-WS à notre secours. Les templates de Spring permettent d'invoquer un service web en manipulant directement les messages, comme nous venons de le faire, mais avec une couche de Spring pour simplifier le code. Spring-WS n'utilise pas notre  pile JAX-WS mais des appels HTTP directs avec Commons-httpclient et XPath pour extraire les données du message de réponse, avec des classes très "Spring" pour mapper les noeuds XML sur nos classes Java.

Le résultat est une très grande souplesse pour s'adapter à des services web pas trop standards (et il y en a, vous pouvez me croire, qui lisent les normes avec les pieds) :

private final WebServiceTemplate webServiceTemplate;

private final XPathOperations xpath;

public NazeClient( String url ) throws Exception {
   webServiceTemplate = new WebServiceTemplate();
   webServiceTemplate.setDefaultUri( url );
   CommonsHttpMessageSender sender = configureSender();
   webServiceTemplate.setMessageSender( sender );
   xpath = new Jaxp13XPathTemplate();
}

private CommonsHttpMessageSender configureSender()  throws Exception {
   CommonsHttpMessageSender sender = new CommonsHttpMessageSender();
   sender.setCredentials( 
       new UsernamePasswordCredentials( "login", "password" ) );
   sender.afterPropertiesSet();
   return sender;
}

public List sendAndReceive() {
   String message = ""; // idem exemple précédent
   StreamSource source = new StreamSource( new StringReader( message ) );
   Result result = new StringResult();
   webServiceTemplate.sendSourceAndReceiveToResult( source, result );

   List values = xpath.evaluate( "//result", 
       new StringSource( result.toString() ),
       new NodeMapper() {
          public String mapNode( Node node, int nodeNum ) {
              return node.getTextContent();
          }
      } );
   return values;
}

05 janvier 2011

GWT round trips

Pour bien entamer l'année je vous propose un petit point sur la phase de chargement d'une application GWT.

La page HTML hôte est chargée par le navigateur (potentiellement mise en cache) et inclut un lien vers le script de sélection, qui lui est configuré pour ne jamais être en cache. Ce script s'exécute et sélectionne la permutation qui convient à votre environnement : navigateur, langue, etc (potentiellement mise en cache) L'exécution de ce script construit l'UI de l'application web et enchaine généralement avec un (voir plusieurs si vous n'avez pas trop bien pensé votre appli) appels RPC.

Au final, on a donc 4 requêtes séquentielles avant que l'application soit disponible pour l'utilisateur.

Pour améliorer les performances du chargement d'une appli GWT, autrement dit la première impression qu'auront vos utilisateurs, il existe plusieurs techniques.

La première, consiste à utiliser une page hôte dynamique [1], une JSP qui va directement inclure le contenu du script de sélection, ainsi que le résultat du premier appel RPC (encodé au format JSON ou GWT-RPC) [2].
La page hôte dynamique nous évite 3 requêtes, contre une petite surcharge de travail côté serveur.

Une autre piste pour aller encore plus loin est proposé dans les derniers builds du compilo GWT, via l'issue 941802. Il s'agit de remplacer la sélection du script côté client par du code côté serveur. La page hôte peut alors contenir directement la permutation GWT adaptée au navigateur client. Ne vous emballez pas, cette option est totalement expérimentale et même pas complète dans le SDK : il vous faudra surcharger le Linker et développer le code d'identification de la permutation, autrement dit retrousser vos manches.


[1] http://code.google.com/intl/fr-FR/webtoolkit/articles/dynamic_host_page.html
[2] http://www.techhui.com/profiles/blogs/simpler-and-speedier-gwt-with

02 décembre 2010

En voila une bonne Idea !

Depuis des années je bosse sous Eclipse, et j'entend cet IDE se faire critiquer à tout va.

Je dois bien reconnaitre que j'ai quelques reproches à lui faire, entre autre la médiocrité de son intégration Maven pendant des années, et son incontournable "building workspace" dès qu'on touche à un fichier sur un projet un tant soit peu ambitieux.

Profitant du passage sur Mac et sous Git (@glaforge sur ou sous ?) qui me déstabilise déjà un peu, j'en profite pour essayer sérieusement Idea. La règle est simple, l'étude que je réalise en ce moment sera développée sous Idea ou ne sera pas ! L'intérêt d'une étude est qu'on réfléchit beaucoup avant de coder, alors ne pas être au top de la performance dans l'IDE n'a pas beaucoup d'impact :P

License Jug-Leader récupérée j'installe l'engin et je peine quelques jours à apprivoiser les menus, fenêtres et raccourcis. Après une première semaine, je commence à me débrouiller. Idea est clairement très différent d'Eclipse.

La philosophie d'Eclipse est d'intégrer les outils pour les rendre invisibles. Avec m2eclipse, on ne lance jamais un build Maven (à moins d'être maso), car l'IDE le lance lui-même dans le cadre de son build incrémental - bouffant au passage un bon paquet de cycles CPU. Avec WebTools, on ne lance pas un serveur d'application, l'IDE redéployant l'application à chaque modification - fonctionnalité qu'on désactive si on a pas un core i7 sous le capot. Au final, l'IDE cherche à nous faire croire que tout est magique et qu'on peut se contenter de vivre dans l'éditeur Java. Idée intéressante si nous avions tous une réserve de CPU hors norme, mais en pratique on passe beaucoup de temps à attendre que l'IDE termine ses tâches. Là où ça devient pénible, c'est qu'il interdit de sauver un fichier en cours d'édition tant que la tâche précédente n'est pas terminée, d'où les frustrations et les critiques.

Eclipse est - en gros - conçu pour des développeurs qui ne maitrisent pas leur environnement. Je ne veux pas savoir ce que fait maven lors d'un build, je ne veux pas savoir comment on déploie un war sur Tomcat, je veux juste coder. La logique "clic bouton" en est la signature, même s'il existe tout de même quelques raccourcis clavier.

La philisophie d'Idea est de proposer un environnement de pilotage des outils, et un éditeur 100% orienté développeur. De très nombreux raccourcis clavier permettent de ne (presque) jamais toucher à sa souris (ex : Pomme+W pour sélectionner des blocs logiques de plus en plus large, variable, expression logique, ligne, bloc, méthode, classe ...). L'éditeur interprète le code Java 100% à la volée sans passer par une compilation comme le fait Eclipse. Il n'y a du coup pas de notion de "sauvegarde". De très nombreux assistants ("intentions") permettent de faciliter le développement : ajouter un import statique, ajouter une dépendance Maven, ...

Lorsqu'on désire lancer un build Maven ou déployer sur le serveur d'application, il faut le demander explicitement, via l'interface dédiée à l'outil dans l'IDE. Au final, l'environnement est globalement bien plus rapide puisqu'il n'a pas ce surcout à gérer. Et même s'il faut lancer et attendre le build Maven pour avoir le résultat attendu, beaucoup de développeurs Eclipse le lancent aussi car ils sont confrontés à des couacs dans leur environnement !

Je suis encore très peu efficace sous Idea, et je découvre un nouveau raccourci clavier toutes les heures en me demandant comment je vais mémoriser tout ça, mais j'ai peur que le retour sous Eclipse que je connais bien fasse mal. Un point délicat tout de même : avec ce nom "idea", il n'est pas facile de faire des recherches Google pertinentes pour trouver de l'info (il vaut mieux ajouter "intellij"), sans compter qu'on est une minorité ! Le côté positif, c'est que Twitter est ton amis pour demander de l'aide ;)

Si vous n'avez pas de licence, demandez à votre Jug local de vous en obtenir une (s'il n'organise pas déjà un tirage au sort).

27 novembre 2010

alors, prends toi zen main

"...c'est ton destin"

En conclusion de Devoxx, les Castcodeurs ont encouragés les français à sortir de leur notoire mode "râleur" pour se prendre en main : achetez vous du bon matos, payez-vous un bouquin et un abonnement Parleys.com pour (re)découvrir tous les sujets de Devoxx 2010, etc.

Dans un domaine ou tout va très vite, il est clair que se maintenir à niveau est un travail quotidien, et qu'il ne faut pas tout attendre de nos employeurs. On peut bien sur regretter que ceux-ci ne prenne pas plus à coeur notre formation, mais soyons pragmatique : un développeur avec 10 ans d'expérience est surtout expérimenté sur 5 années d'une techno dépassée. Du point de vue d'un recruteur ce n'est pas quelque chose de recherché au premier abord, même si c'est une expérience valorisable.

Ceux qui ont développé en EJB 2 savent pas exemple pourquoi on lui préfère aujourd'hui Spring ou les EJB 3, et peuvent donc mieux appréhender ces technologies - cependant ce n'est pas une source immédiate de productivité, donc cela ne justifie pas de payer un "10ans" alors qu'un "3ans" sait faire à peu près aussi bien pour moins cher (je prend le point de vue du recruteur, dans les faits ce n'est pas aussi évident :P). Quelle plus-value avons nous à proposer ? Appréhender rapidement une nouvelle techno, être au courant de ce qui fait le buzz, avoir un réseau de connaissance. Les User Groups sont évidemment la place privilégiée pour cela !

Qu'est ce qu'un employeur est disposé à financer ? Un bouquin ou une formation en rapport avec le projet sur lequel vous êtes affecté, évidemment. Par contre, si ça sort de ce cadre il faudra ramer pour se justifier. Idem pour le matos : Si les études montrent qu'on est plus productif avec de grand / multiples écrans, nous sommes nombreux à devoir bosser sur des machines bureautiques qui atteignent  péniblement le WXGA sur un 15". Evidemment, rien ne vous oblige à investir comme moi dans un MacBook qui vous coutera un bras, mais un 22" correct c'est 200€ de nos jours, sans parler d'un vrai clavier confortable ou d'une bonne souris, investissement qui vous économisera une séance d'ostéopathe à 50€.

Il reste regrettable de constater que nous avons presque tous une meilleur infra à la maison que sur notre lieu de travail : ordinateur musclé, bien accompagné, et pas encombré d'un antivirus paranoïaque; accès Internet à haut débit (et pas une pauvre liaison ADSL partagée à plus de 100 personnes), etc. Mais, en démontrant par l'exemple qu'on peut travailler mieux avec du bon matos, peut-être arriverons nous un jour à changer cette tendance.

Petit papa noël, penses à nous :D

19 novembre 2010

Java community Q&A

Pour cette keynote, Joshua Bloch, Mark Reinhold, Stephen Colebourne, Antonio Goncalves, Juergen Hoeller et Bill Venners débattent des orientations de la plateforme Java face aux questions de la communauté.

Java doit-il rester backward compatible ou devons nous avoir le courage de casser les choses ?

La question ne fait pas l'unanimité. Rien que dans le JRE, les méthodes deprecated ne disparaissent souvent pas au cours des versions suivantes. Joshua aimerait pourtant (par exemple) que la notation "32l" pour définir un long 32 (et pas l'entier trois-cent-vingt-et-un !) ne soit pas acceptée, et remplacée par "32L" moins ambigu. Evolution simple mais déjà pas si simple d'obtenir le consensus.

Quel impact d'Oracle sur la communauté Java ?

De l'avis général, tout n'a pas été positif, mais personne n'ose explicitement mettre les pieds dans le plat. Antonio prend finalement la parole pour résumer le BOF Jug d'hier qui a été positif et les opportunités qu'Oracle nous propose.

Comment gérer le problème de licence du TCK Java ?

(rappel : Apache Harmony ne peut pas être validé "Java" pour cette raison). Mark Reinhold ne veut pas se dérober à cette question (ce qui l'obligerait à porter un chapeau ridicule en alu, c'est la règle), cependant il ne peut pas répondre officiellement... mais ne voit pas Apache obtenir une licence TCK ni à court ni à long terme.

Android peut-il être la plateforme Java mobile de facto ?

Antonio élargit le problème à la gestion des communautés Groovy, Scala, et donc Android, qui font partie de l'écosystème Java sans rentrer dans le moule. Juergen ajoute Google App Engine et défend que ces initiatives permettent de défricher l'avenir de Java et doivent avoir leur place, en tout cas être "autorisées" dans la communauté. En résumé, avoir ajouté un aspect légal sur le débat est la pire chose qu'il y avait à faire.

Qu'est ce que .Net (plateforme/communauté) pourrait nous apprendre pour améliorer Java ?

Techniquement, .Net a bénéficié de Java pour ne pas faire les mêmes erreurs. Les puzzlers de Joshua, traduits en .Net, ne produisent plus de problème par exemple. Cela nous ramène à la première question ...

Va t-on voir la fin de la gue-guerre JigSaw/OSGi ?

Oracle vend en effet des produits basés sur OSGi, alors ? OSGi est utilisé sur de gros frameworks, serveurs d'application, middlewares, etc, mais est peut être un peu compliqué pour un usage plus standard. Java 8 vise plus une unification pragmatique, pour résoudre les problèmes simples dans la JVM, ce pour lequel OSGi est sur-dimensionné.

Comment gérer les JVM legacy que nous héritons du parc installé (i.e. Websphere) ?

Le passage en Java5 n'est pas encore une généralité... alors Java 7 ! Un problème dérivé est le temps entre la finalisation d'une JSR et son implémentation. Un an après JavaEE 6 les grosses implémentations ne sont pas encore là. Peut être revoir la logique du JSR pour être plus incrémental...

Java permettra t-il d'accéder aux noms des paramètres de méthodes ?

oui ! c'est possible, reste à savoir comment ... car cela va poser un problème de compatibilité (retour à la question 1 encore une fois).

L'approche fonctionnelle est-elle si pertinente qu'elle devrait être formellement intégré à Java ?

Scala, Clojure montrent la voie, doit on avoir un langage officiel pour cela ? Retour en arrière pour rappeler l'engouement pour XML et sa désaffection (relative). L'associer très officiellement à Java aurait-il eu un intérêt ? Si l'approche fonctionnelle apporte une vision intéressante, trop de choses dans le langage risquent de le scléroser. Par contre, des facilités dans le JDK pour mieux supporter les langages fonctionnels sont une option à considérer ...

Comment Oracle espère t-il faire revivre JavaME fàce à la concurrence sans Android ?

Modular Java permettrait de faire entrer Java sur des mobiles, cependant cela reste hypothétique. La question renvoie à l'organisation du JCP, et ses nombreux représentants issus du monde mobile.

Comment corriger le JCP ?

Idéalement : construire une structure indépendante, sur le modèle de la fondation Eclipse. Mais quel intérêt pour Oracle de lâcher sa main-mise sur Java ? Antonio modère le sujet en précisant que la participation au JCP reste ouverte et que certaines JSR sont pilotées par des indépendants. Toujours plus de transparence reste cependant une priorité.
Le lien avec la position dure prise par Doug Lea sur le JCP est porté par la question suivante, mais baser Java 7 sur le seul OpenJDK ne peut être la solution. Comment savoir ce qui fait foi, comment savoir si le code d'une JVM alternative est  respecte la norme ou est juste compatible ? Des petites phares fusent, elles ne manqueront pas d'être reprises sur twitter :P

Jusqu'à quand l'historique desktop de Java va t-il encombrer le JRE ?

C'est l'une des raisons d'être de Java modularisation ! Sur le besoin de modularité, l'unanimité est faite.

La plateforme correspond elle à l'utilisateur "standard" de Java aujourd'hui ?

Joshua est partisan d'une simplification de la syntaxe et de l'élimination de nombreux tweaks qui font de Java un outil pas 100% satisfaisant pour la grande majorité de développeurs qui programment pour payer leur facture. Les geeks qui vont aux JUGs et à Devoxx sont une toute petite minorité. Qui par exemple a défini ses propres annotation ? Qui utilise les generics pour autre chose que des List ? Il manque peut être un niveau de langage dédié aux développeurs de librairies et un autre pour le développeur lamba...

Dernière ligne droite ...

Dernier jour à Devoxx, les stands se démontent, beaucoup sont déjà partis. Les survivants se regroupent à l'étage au pied des salles pour un dernier café. Ce matin, la keynote sera consacrée aux attentes de la communauté sur l'avenir de Java, synthétisées après deux BOFs les jours précédents. Antonio s'y colle pour représenter les JUGs, quand on lui tend un micro il ne sait pas résister, pire qu'un gosse :P

Suivra l'enregistrement live des castcodeurs, en parallèle des quelques sessions qui terminent cette édition, et pour moi un retour express à la gare pour ne pas louper mon Thalys.

Ce que je retiens de cette édition :

  • la force de l'approche REST. Le programme de Devoxx a été mis à disposition via une API Rest, s'en est suivi une poignée de clients pour iPhones, iPad, Android, GWT, Flex, JSF+HTML5 (et pas JavaME, tiens?). Ce petit exemple montre que REST est peut être l'approche qu'on attendait de longue date pour découpler la présentation du métier, laissant chaque couche choisir sa technologie d'implémentation.
  • le Cloud, très présent sur cette édition même si j'ai suivi peu de sessions, avec des retours d'expérience de FaceBook et Twitter pour lesquels les volumétries tiennent du délire.
  • la communauté Java qui s'organise et Oracle qui a clairement appris à l'écouter. Après un passage à vide, la reprise du flambeau par Oracle semble donc bien engagé.


Rendez-vous l'an prochain pour Devoxx 2011, si je ne vous ai pas convaincu que c'est LA conf à laquelle il faut venir, je ne peux plus rien pour vous :P Pensez aussi à l'abonnement PArleys à 79€ pour voir ou revoir toutes les sessions.

18 novembre 2010

JavaPuzzlers et BOF

Dernière session de la journée, un bon vieux Java Puzzler de Joshua Bloch. Si vous ne connaissez pas, procurez-vous le bouquin ! En gros, ce sont des fragments de code qui cachent un bug auquel on ne pense pas du tout au premier abord. Un raffinement dans la gestion du compilateur ou dans la structure des collections, bref un truc qui peut vous plomber une appli. Avec une mise en scène qui donne un style très spécifique aux présentations de Joshua Bloch, 6 puzzlers de ce type sont présentés puis décortiqués, avec à chaque fois une lesson à retenir.

Votre serviteur s'en tire avec 2 bonnes réponses (avec la bonne explication, sinon ça ne compte pas) sur 6, on va dire que la journée était rude pour me trouver une excuse ;)

On enchaine avec la dernière soirée autour des stands des sponsors, qui seront démontés dans la soirée. C'est l'occasion de récupérer tous les goodies qu'on a pas réussi à gagner par tirage au sort parce qu'il faut écouler les stocks avant de remballer - hop, une clé USB IBM et un TShirt Capgemini ;)
Ajoutons à cela quelques bières sur le stand Oracle (je ne sais pas si je vous l'ai dit, mais à Devoxx on boit pas mal de bières), et voila que je loupe le BOF JDuchess, c'est malin ...

Je me rattrape en rejoignant le BOF JUG-Leaders qui à lieu juste après. Jackie, représentant Oracle, vient renouer le lien avec les JUG-Leaders, lien qui avait été mis à mal par les petites erreurs de communications d'Oracle après sa reprise de la communauté Java. Pour résumer, après les propositions déplaisantes dont j'ai déjà parlé sur ce blog, Oracle laisse au JUGs carte blanche pour organiser leur activité, par contre il propose - au dela de ce que SUN faisait - de nous joindre aux réunions annuelles des OUG pour bénéficier :

  • d'un peu de pub sur les produits Oracle (faut bien justifier l'hotel qu'il nous réservent),
  • d'échanges privilégiés avec les représentants Oracle,
  • de temps pour échanger entre JUG-Leaders, bien plus que l'heure consacrée au BOF une fois par an à Devoxx.


Ce dernier point est important car il nous permettrait de rentrer dans une dynamique bien plus puissante que ce que nous connaissons aujourd'hui, avec des JUG qui s'entraident pas copinage. Par contre, cela suppose un minimum de structuration, une hiérarchie des JUGs pour qu'Oracle n'ai pas 200 interlocuteurs.

En pratique, ce n'est pas vraiment un problème : tous les JUG-Leaders ne sont pas disponibles pour se libérer 2 jours je ne sais où, et nous sommes déjà organisés en réseaux informels en fonction de notre taille et de notre représentativité respective. Aucun JUG-Leader français ne reprochera à Antonio de s'être exprimé en notre nom lors du premier contact avec Oracle, car il le fait en toute transparence et n'hésite pas à donner de sa personne au ParisJug pour laisser une place aux JUGs de province.

Oracle opère donc un virage à 180° et a retenu la leçon de sa communication ratée des premiers jours. Jackie est une représentante sympathique et très ouverte, prête à nous entendre et à adapter l'organisation des meetings OUG pour nous y faire une place. Et pour finir sur une touche de bonne humeur, on termine le BOF au mexicain d'à côté autour ... d'un Mojito (une fois n'est pas coutume).

Modularisation de la JVM

Cette session présente JigSaw, qui continue son lobbying pour imposer à la JVM une modularisation autre que celle proposée par OSGi ...

A quoi ça sert ?  A sortir du classpath Hell, à accélérer le lancement de la JVM, à alléger le runtime, à approvisionner automatiquement (comme le font les Linux avec apt ou yuml), et à assurer la prédictibilité de l'environnement d'exécution.

La vérification du classpath à l'installation plutôt qu'au runtime, associé à la construction de profils pour une application (liste des classes effectivement chargées lors du premier lancement) doivent nous apporter un gain significatif de fiabilité et de réactivité. La mise en cache des description des classes (i.e. conversion des .class dans un format plus efficace) est aussi une astuce exploitée pour améliorer encore l'environnement d'exécution Java. Toutes ces optimisations sont liées à la possibilité de traiter les problèmes de classpath lors de l'installation, et non au runtime.

Le fichier module-info.java (non qui est en principe invalide pour une classe normale) sert de descripteur à la définition d'un module - à une autre époque on aurait choisi un descripteur XML, les temps changent. Le module permet de définir les requirements de notre module (en gros, les dépendances runtime si vous raisonnez comme moi en langage Maven), y compris avec la notion de requirement optionnel et bien sûr cela implique la gestion de la transitivité - espérons que le modèle choisi pour cela sera compatible avec Maven et OSGi, sinon ça promet...

Avec cette possibilité de définir des modules, il devient facile de découper un gros projet en modules et de les référencer dans un module aggrégateur (tout ce vocabulaire me rappelle bizarrement quelque chose).

A l'usage, le compilateur javac proposera une nouvelle option -modulepath permettant d'indiquer les emplacements de nos modules - en gros, notre localRepository :P. La nouvelle commande jpkg permet alors de construire un livrable selon un nouveau format (oubliez vos jars). La commande jmod quand à elle nous apporte l'approvisionnement des modules pour pouvoir lancer la JVM avec un paramètre -mlib indiquant l'emplacement des modules nécessaires à l'exécution. Et comment fait-elle cet approvisionnement ? Avec un dépôt de modules ! Et bien sûr, le repo maven2 est supporté comme source de modules. Qui a dit "standard de fait" ?

Avec ce mécanisme, une application Java va donc pouvoir démarrer avec une version "allégée" de la JVM, typiquement le lancement d'un batch en ligne de commande ou d'un serveur d'application va s'épargner toute la couche graphique AWT et Swing.

Comment tout ça va s'intégrer au JRE ? Un slide nous présente les dépendances entre packages Java, et on a un magnifique effet spaghetti à l'écran, surtout avec l'ajout des API JavaEE par dessus couleur sauce tomate... Après un gros refactoring, la JRE est descendue à un graphe de 25 noeuds et 97 relations, qui devient raisonnablement affichage dans un slide. Ca a du être un sacré boulot :) En terme de compatibilité, cela suppose néanmoins que les applications existantes ne dépendent que des API publiques et pas de leurs détails d'implémentation.

Et OSGi dans tout ça ?

Au moins on écarte pas le débat lors de cette session... Mark Reinhold répond en un exemple : un module A requiert un module B. Avec la modularité Java, A et B peuvent être packagés en paquet debian et résolus à l'installation. De même, Maven gère sans soucis ce cas d'utilisation. Dans le cas d'OSGi, deux bundles peuvent exporter la même API publique sans définir de moyen de résolution privilégié. Le modèle OSGi est donc implicitement plus complexe, focalisé sur un niveau de granularité package, ce qui est souvent un niveau trop fin pour modulariser du code.

Critéria & JavaPosses

Histoire de ne pas me retrouver à nouveau sur les marches, je m'installe dans la salle qui accueillera tout à l'heure l'enregistrement live de JavaPosses pour une session de présentation de l'API Critéria JPA 2.0. Je ne suis pas le seul vu que - pour une fois - la session finit avec une salle deux fois plus remplie qu'à son démarrage.

Rien de fondamental à dire sur cette session Critéria, qui expose clairement le problème des requêtes écrites sous forme de String - donc sans contrôle à la compilation - et l'intérêt du modèle type-safe des Criterias et du méta-modèle JPA 2.0.

Une question tout de même qui retient mon attention : les requêtes par l'exemple sont toujours exclues, et pourtant elles sont si pratiques pour de la recherche multi-critères...

Suit donc l'enregistrement de JavaPosses (les castcodeurs en version US si vous ne connaissez pas). La session commence par une distribution de bières offertes et décorées aux couleurs d'Atlassian, avant de se lancer dans un sondage délirant, mesuré très scientifiquement à l'applaudimètre, et destiné à aider le JCP à orienter l'avenir de Java : quel est notre langage préféré sur la JVM, notre feature favorite pour Java 7, etc... les 4 cow-boys (dont un en duplex des US) mettent l'ambiance.



Un très bon moment, certes sans grande révélation, mais on est pas là que pour apprendre des choses compliquées ou boire de la bière ;)

Getting things done & OpenJDK

Seconde session "méthodologie", une mise en pratique du "Getting Things Done" au métier de programmeur. La promesse d'être efficace et d'améliorer sa productivité et sa focalisation sur son travail, qui dirait non ?

Le début de la présentation est très théorique, en dehors d'une citation de l'excellent EverNote pour la collecte des tâches individuelles et de tous les documents associes. Je finit par quitter la salle a mi-session, pas convaincu d'y apprendre grand chose (NB : j'utilise déjà un kanban personnel). Si ça peut paraître indélicat, c'est une pratique courante dans ces salles gigantesques, et on se rassure en sachant que le speaker a 4 spots en pleine tronche et ne nous voie pas sortir. Il y a deux ans, IBM avait placé des puces RFID sur les badges et mesurait le remplissage des salles. Au final les courbes n'ont pas été diffusées, pour diverses raisons, mai peut être aussi parce qu'elles montraient parfois une désaffection de plus de 30% dans le premier quart d'heure - il ne faudrait pas se mettre mal avec les speakers ;)

J'en profite pour descendre dans le hall et collecter deux trois goodies supplémentaires sur le stand IBM ;)

On enchaine donc avec la session consacrée à OpenJDK.

Petit rappel de l'engagement pris par Oracle à JavaOne concernant sa contribution à OpenJDK, le maintien de la licence open-source, de la distribution gratuite de Oracle JRE et l'accueil fait aux contributeurs. La grosse contribution d'Oracle sera le transfert dans OpenJDK du résultat de la fusion d'HotSpot avec JRockit, ce qui n'était pas forcément évident en terme de positionnement commercial de des deux JVM du portefeuille d'Oracle.

En Octobre, IBM a annoncé rejoindre le projet OpenJDK. Allié de poids, en particulier avec la définition de deux JSR pour clarifier le contenu des JDK 7 et 8. Le JCP reste donc l'entité qui définit Java et pilote son implémentation de référence, dans un fonctionnement communautaire.

En Novembre, Apple rejoint à son tour OpenJDK pour assurer l'avenir de Java sur sa plateforme. En particulier, dans les prochains mois, Apple va proposer une intégration graphique Cocoa native, et non pas son pâle reflet X11 comme le propose Soylatte. Il reste cependant certaines parties du Java6 d'Apple qui ne sont pas "ouvrables"...

Trois poids lourds au chevet du projet, voilà ce qui devrait assurer à la fois la bonne santé d'OpenJDK en terme de ressources de développement et un équilibre en terme d'influence de chaque éditeur : sur 250 développeurs, 60 ne sont pas affiliès à Oracle. La richesse de l'écosystème OpenJDK est présenté au travers d'exemple de contributions externes, issues de RedHat, Google ou du MIT.

On passe quelques instants du côté obscur : comment contribuer, comment builder sa propre version du JDK, comment postuler chez Oracle en tant que contributeur ! Si la commande "make" ne vous fait pas peur et que vous voulez essayer Mercurial, ...

Pour conclure, afin de ne pas se noyer dans les 50 mailing list du projet et ces diverses variantes, l'aggrégateur de blogs PlanetJDK est le meilleur moyen pour se tenir au courant de l'activité du projet.

Keynote day 2

Après le traditionnel tour des stands à la pêche aux goodies - pas de canard Adobe cette année :'( - je m'y prend un peu plus tôt ce matin pour m'installer dans les confortables fauteuils de la salle 8, qui accueille la keynote. L'immense écran (Devoxx se tient dans un cinéma multiplex) affiche un twitt-wall gigantesque sur lequel nous sommes quelques-un a jouer au social-network sur écran géant :


Stéphan Jansen fait une rapide intervention - et interrompt le jeu des twitts :'( - pour nous annoncer qu'il y a déjà 70 inscrits au channel payant de Devoxx 2010,  qui donnera accès dans quelques jours à TOUS les talks de devoxx, alors que les autres devront attendre leur publication au compte goute au cours de l'année, et qui permet de suivre les keynote en streaming direct.

On passe ensuite (enfin ?) à la keynote, consacrée à l'avenir de JavaEE.

Si JavaEE propose un modèle fiable et reconnu, lorsqu'on considère la montée en puissance du Cloud il manque de nombreuses API standardisées pour la gestion propre à ce mode de fonctionnement (stockage distribué à la S3 par exemple). JavaEE doit aussi repenser son modèle de packaging : le déploiement de versions concurrentes d'une même application, l'upgrade de version, le versionning des données associées, sont des éléments indispensables pour une utilisation en mode cluster/cloud, mais encore absents de la norme.

Pour ne pas rester sur de la théorie, on passe maintenant à une démo de ce que propose GlassFish en mode cloud. Pour la petite histoire, la démo est faite sur un MacBook ... sous Ubuntu ! C'est vraiment une conférence de geeks ;) Sur la base d'une image JeOS ("Just Enough OS", un OS réduit et optimisé pour la VM) Glassfish, un cluster virtuel est lancé. Les commandes asadmin proposée par glassfish permettent de lancer et d'administrer un cluster Glassfish en trois commandes sur une IaaS.

Retour sur les slides. JavaEE 7 exploitera la modularité JavaSE 7 (donc, oubliez OSGi pour l'instant). La modularité permet d'identifier les composants redondants et de les partager automatiquement, évitant les doublons et autres conflits dans le classpath.

JSF de son côté va profiter de quelques évolutions dans la version 2.1, mais le plus intéressant viendra avec JSF 2.2 et le support d'HTML 5. JMS va également subir un lifting pour clarifier quelques points et s'ouvrir aux nouvelles tendances expérimentés dans le monde du MOM. La couche Web se met à jour avec le support des web-Sockets, de JSON, de HTML5, et l'utilisation des nouvelles nouvelles I/O (NIO-2) pour le connecteur HTTP (ce qui devrait reléguer le couple Apache-JK au rang d'antiquité).

Linda DeMichiel prend la parole pour faire un focus plus approfondi sur JPA 2.1. Basé sur les demandes de la communautés, une liste de fonctionnalités candidates est présenté :

  • les types custom
  • les fetch plans
  • de nouvelles méta-données de mapping
  • des stratégies de nommage définies par l'utilisateur
  • plus de flexibilité sur les valeurs générées (et pas seulement les clés)
  • la gestion des attributs immuable (readonly)
  • plus de flexibilité dans le descripteur XML
L'API évolue aussi pour dévoiler les fonctionnalités internes du mapper O/R: listeners, extension du méta-modèle, détection de l'état "dirty" des entités... Le langage de requête s'enrichit pour accéder aux procédures stockées, downcasing (accès à un sous-type précis), outer-joins avec condition "ON", élargissement de l'API Critéria aux Updates et Delete.

Globalement, JPA 2.1 cherche donc à consolider sa place de norme largement adoptée en restant à l'écoute du terrain et en intégrant les extension / évolutions réclamées par les utilisateurs. Exemple : l'unwrapping de l'EntityManager pour accéder à l'implémentation sera explicite, permettant d'utiliser quand c'est nécessaire les fonctionnalités propres à Hibernate ou EclipseLink.

On passe enfin à JAX-RS. Exclu du web profile de JavaEE 6, JAX-RS est cependant une norme majeure avec de nombreuses implémentations open-source. Dans les deux années qui nous séparent de JAX-RS 1.0, ces framework ont beaucoup évolué et innové. Il est temps d'intégrer les innovations qui ont fait leur preuve dans la norme : Premature Standardization is Evil ;)

La fonctionnalité la plus attendue et l'API cliente JAX-RS. Jusqu'ici on pouvant écrire des service mais pas les consommes sans partir sur du code propre à une implémentation, c'est donc un complément indispensable. L'intégration avec les autres briques JavaEE avance, avec le support de @Inject et de gros progrès dans l'intégration avec CDI. De nombreux points restent encore en suspens pour une syntaxe légère et non surchargée d'annotations.

 La gestion asynchrone, basée sur Atmosphere, est aussi au rendez-vous. L'API de @Broadcast est d'une grande simplicité et masque complètement la complexité de la technologie. Il faudra qu'on fasse une session sur le sujet au BreizhJUG ;)

17 novembre 2010

Devoxx, quand y'en a plus, y'en a encore

Devoxx, c'est aussi l'après Devoxx.

D'une part il y a la soirée frite + bière, avec un petit bonus sur chaque stand. JBoss offre de la bière (des fois que les 10 bombones ne suffiraient pas), Oracle fait son super-tirage (j'ai gagné un stylo qui clignote, cool), IBM sort le champagne. Au final on est donc bien frais.

Ensuite il y a "officiellement" les BOF (Birds Of a Feather flock together) de 19h à 23h, permettant à chaque communauté de se rencontrer "In Real Life". BOF Jug-leaders demain, BOF Parleys ce soir, BOF JavaFx, BOF Scala, etc.

A côté il y a les BOF non-officiels, comme le rencard Play! suivi du rencard JUG au resto mexicain d'à côté (le seul resto du coin en fait, en dehors du MacDo)

Et si ça ne suffit pas il y a les plans tribus, comme le repas opensource dieux sait ou dans un resto en centre ville (les infos circulent sur twitter : voir le twittwal).

Inutile de dire qu'une semaine de Devoxx, ça calme ...

Performance Anxiety

Joshua Bloch fait salle ultra-comble, comme Brian Goetz il y a une heure que je n'ai pas pu suivre. Les allées et les escaliers sont pris d'assaut, le couloir reste encombré, n'imaginez même pas accéder à  la salle (je ne suis pas complètement sur que ce soit conforme aux règles de sécurité pour la salle d'ailleurs). Dur pour les speakers qui sont programmés au même moment dans l'une des 5 autres salles. Sujet du jour - les performances :D

En attendant que la conf démarre (parce qu'il ne suffit pas d'arriver 10 minutes à l'avance, je suis assis sur les marches et je ne suis pas le moins bien lotti) un détail sur Devoxx pour ceux qui voudraient venir l'an prochain : Devoxx c'est 3000 personnes et beaucoup de français. On peut donc y rencontrer plein de gens biens, en plus d'assister à des confs passionnantes, à condition de bien gérer son emploi du temps. L'effet de bord c'est qu'on se retrouve convié à des BOF le soir et/ou à des repas de JUG-leaders, Opensource-man, Truc-community. Ce soir je vais devoir me cloner ;)

Joshua est sur les starting blocs et commence avant l'enregistrement, ils faut donc l'arrêter déjà lancé dans son discours - comme quoi les problèmes de performance ne sont pas limités à l'informatique :P Bon, ça suffit pour les crétineries, soyons sérieux deux minutes.

Parlons donc performances et optimisation, avec un disclaimer "Premature Optimization is Evil" ...

Avec l'augmentation de l'abstraction et la programmation devenue une discipline empirique, on ne peut plus que mesurer les performance et plus les estimer. librairies, langage, VM ou processeurs sont de plus en plus complexes et abstrait, et introduisent une dimension d'imprévisibilité dans nos estimations de performance. Que ceux qui peuvent dire qui d'un AND conditionnel (&&) et d'un AND logique (&) est le plus rapide lèvent la main ;) La prédiction de branchement dans nos processeurs fausse notre interprétation naïve du problème. La réponse est ... ça dépend !

La performance de lecture d'un attribut dans un objet ? ça dépend ! Est-il volatile ? Sur quel processeur ? Est-il un attribut d'une classe imbriquée - dans ce cas, c'est un appel de méthode, sauf si le compilo l'à inliné. Ca dépend, il faut mesurer !

Un bench simpliste montre déjà l'effet du premier lancement par rapport à la répétition : le warm-up de la JVM et la stabilisation de ses optimisations. Pas de grosse surprise jusqu'ici. Cependant, après plusieurs tirs (même si Joshua n'arrive pas de le montrer sur sa démo) les résultats peuvent être très différents sur un autre tir. Il est donc très difficile de comparer des résultats, et donc de voir les effets de changements dans le code.

La complexité de notre stack matérielle et logicielle nous oblige à renoncer à la prédictibilité. Rien qu'en analysant les possibilités d'inlining que la VM peut appliquer à un fragment de code simpliste, la combinatoire donne des résultats très variables. Or le "Compilation Planing" de la JVM Just-In-Time est un processus en tâche de fond, non-déterministe lors de notre mesure :'( Les mêmes dérives sont constatées sur du code C/C++ (la VM n'explique donc pas tout) ni même sur du code assembleur. L'outillage (comme un profiler) peut d'ailleurs fausser la mesure au point d'invalider toute l'analyse : 6 profilers testés sur un même code on détecté des "hot-spots" différents :'(

Notre seule solution : une approche statistique ! En multipliant les runs, en groupant les données et en effectuant une analyse statistique on obtient une meilleure vision de nos performances, et la moyenne n'est pas le seul résultat à retenir : l'étalement des mesures peut être impressionnant.

En tant que développeur d'application nous ne pouvons donc que reposer sur des constructions validées et stables en conservant un niveau d'abstraction maximal. En tant que développeur de librairie, nous devons étudier soigneusement les recommandations des spécialistes pour éviter les constructions hasardeuses (classes imbriquées de visibilité private par exemple) qui ajoutent du flou dans le traitement du compilateur, et donc dégradent d'autant la prédictibilité. Comment les connaître ? Demandez à Doug Lea - ou achetez son livre ;)

L'art du benchmark est très délicat, largement détaillé par Cliff Click (JavaOne 2009). Caliper est un framework qui peut aider à en construire avec un bon niveau de fiabilité. Quoi qu'il en soit, Joshua conclut que nous vivons une époque passionnante dans laquelle le prédictif se perd et où nous devons apprendre à mesurer notre travail avec de nombreuses précautions.

Cassandra

NoSQL est à l'honneur de cette édition de Devoxx, avec des speakers de Facebook, Twitter ou LinkedIn. Cassandra, projet Apache opensourcé par FaceBook, basé sur les travaux de Google BigTalbe et Amazon Dynamo, est présenté au cours d'une de ces sessions.

Retour en arrière sur les documents d'architecture d'eBay et l'approche BASE, qui prend le contrepied de l'ACID qui sous-tend nos bases de données relationnelles. En considérant la base de donnée comme un flux de données et non comme un ensemble synchronisé à coup de verrous pessimistes, une nouvelle architecture se profile.

Cassandra utilise des tables en mémoire qui sont flushées sur disque de manière asynchrone. Ce découplage avec les I/O donne à la base un avantage qui booste ses performances, le risque étant compensé par une gestion de version des données via un commit log. Contrairement au mythe, la scalabilité de la base ne concerne pas exclusivement les énormes sites de réseaux sociaux. De la même manière, l'abandon de l'ACID ne signifie pas que les données stockées ne peuvent pas être stratégiques : la gestion de version assure qu'aucune donnée n'est perdue. L'argument type pour justifier un stockage NoSQL est de considérer les applications qui ajoutent un cache distribué au dessus de leur accès base. Le résultat est équivalent sans avoir la puissance d'une base NoSQL.

Une fois cette nouvelle logique acceptée, Cassandra apporte une souplesse sans précédent en terme de scalabilité, de réplication, d'absence d'un "single point of failure". Voilà qui chamboule fondamentalement notre point de vue sur les bases de données et leur administration : la réplication naturelle des noeuds assure une fiabilité et une re-synchronisation des données sans opération d'administration dédiée.

Le format de données utilisé par Cassandra, comme pour Google BigTable, est une série de clé:valeur libres associée à un ID (ColumnFamily). Ce formalisme particulier, très différent du SQL traditionnel, change la donne au problème du dimensionnement et de l'indexation. twissandra (démo ici) sert de base aux démos et explication sur la structure et la manipulation très particulière de ces données. Le modèle simple et connu de tous de twitter et la comparaison avec l'équivalent SQL en font un exemple concret et très parlant. Les requêtes en base ne se basent plus sur des approches ensemblistes mais sur des parcours "sliceQuery" des entrées d'une "table".

La manipulation des données de Cassandra peut monter d'un niveau d'abstraction, avec des frameworks comparables à notre pile Driver / JDBC / JPA. Un portage de Lucene (Lucandra) permet par exemple pour apporter la recherche à notre base NoSQL.

Next Big Java Language

Qu'y aura t-il après Java ? Il ne s'agit pas de trouver ici le prochain langage de geek, mais celui qui accompagnera les millions de développeurs "collet bleu" qui ne vont pas aux conférences, ne bénéficient pas de formation avancées.

Partant de ce que 15 années de Java nous a appris, XX établit une liste de constats.

  • les exceptions"checked" compliquent le code plus qu'elles nous aident
  • le fait que les primitifs et les tableaux ne soient pas des objet complique le langage (mais améliorent les perfs), en particulier avec la surcharge des méthodes : foo( (short) 2) appel t-il  foo( Integer ), foo( int ) ou foo( Object ) ?
  • les génériques de Java, avec leurs "super" et "extends" sont un nid de confusion


D'où quelques critères - le prochain "gros" langage de la JVM devra :

  • avoir une syntaxe C-like pour s'apprendre facilement - considérant la base installée de développeurs
  • être orienté-objet ET fonctionnel, non puriste d'un de ces deux paradigmes 
  • typé statiquement, mais sans la rigueur excessive de Java, en particulier pour la réflexion. Invoquer dynamiquement une méthode devrait être trivial
  • intégrer nativement les patterns que nous employons couramment et qui alourdissent le code : JavaBeans vs Propriétés, gestion du Null, Concurrence et Threads, Modules et visibilité, etc
  • être adapté pour l'outillage, IDE, debuggers et profilers. L'IDE ne peut pas tout deviner tout seul, le langage peut l'aider dans son travail
  • Etre raisonnablement ouvert aux extensions


Que donnent les langages alternatifs actuels au travers de ce prisme ?
Groovy est un assez bon candidat, mais son aspect dynamique le rend trop souple et mal adapté pour remplacer Java. Par contre il en est un excellent complément.
Scala est trop puriste du fonctionnel, trop strict, trop élitiste, trop différent de l'historique C/Java
Fantom a un bon potentiel, mais ne propose pas un modèle de typage suffisant. L'absence de génériques (en dehors des listes et maps) est un recul inacceptable.

Alors ? La solution pourrait être un Java ... sans compatibilité ascendante. On prend Java et on en retire tout ce qu'on sait aujourd'hui ne pas être un bon choix. L'outillage peut assurer la conversion du legacy si besoin. Peut être pour Java 9 ... à suivre sur twitter via #bijava !

Dev/Ops, mais sans le "/"

Devoxx propose toujours des sessions plus "méthodologie" avec une mise en avant de l'agilité. Cette session se consacre au mouvement DevOps, sur fond de licornes, de vampires et de loup-garous - illustration inhabituelle mais bien menée.

Le constat est simple : nous, développeurs, ne sommes pas sensibles au problématiques de opérationnels, qui n'ont aucune considération pour nos choix organisationnels. L'agilité de nos développement ne peut-elle pas être transposée au monde de l'opérationnel ?

L'idée des DevOps est d'intégrer les opérationnels à l'équipe, comme nous l'avons fait des testeurs. Déployer, c'est compliqué, ça marche parfois mal. Donc déployons souvent, avec un maximum d'automatisation. Déployons sur des plateforme de développement et de test iso-production, et toujours avec le même outillage. Gérons en configuration tous nos environnements.

Ce discours rejoint "Continuous Delivery" que je lis en ce moment, livre passionnant qui pousse de nombreuses idées très novatrices (au moins pour moi). On retrouve les concept du "Stop the line", de la tolérance 0 au défauts, de la gestion de la dette technique, etc.

Si organisationnellement les choses doivent être bien moins simples que sur les slides (un peu comme Scrum qui nous dit qu'il n'y a qu'un seul Product Owner, sans dire comment on en arrive là), c'est un mouvement à suivre de près et dont sortirons certaines des pratiques de développement de la prochaine décennie (enfin, d'après ma petite Mme Irma de poche).