Il y a 13 ans -
Temps de lecture 12 minutes
Jazoon’10 – Jour 1
Comme nous vous l’avions annoncé, Xebia était présent aux deux premières journées de la conférence annuelle Jazoon. Des soucis d’ubiquité nous ont évidemment empêché de suivre toutes les sessions, tenues dans 4 salles différentes en même temps. Nous avons dû faire des choix, parfois difficiles, pour vous relater le meilleur de cet évènement.
Premières observations :
- légère baisse d’affluence par rapport à l’année dernière,
- forte présence de JavaFX avec pas moins de six sessions, ainsi que d’OSGi,
- très bonne ambiance et organisation,
- excellents speakers, merci à eux.
Nous allons vous rendre compte des sessions suivantes :
- Java SE and JavaFX: The Road Ahead
- Client / Server 2.0 with Java and Flex
- Frameworks and security : how they kill your security scanning
- Object of value
- Construction techniques for domain specific languages
- Servlet 3.0
- 97 things every programmer should know
Java SE and JavaFX: The Road Ahead
Jazoon 2010 commence par une keynote de Danny Coward sur l’évolution du langage java. Danny revient sur l’évolution de Java depuis le début du langage (Java a 15 ans depuis le 24 mai). Il y a désormais plus de 7 millions de développeurs Java à travers la planète, près d’un milliard de JVM déployées, et plus de 2 milliards de téléphones mobiles avec une JME.
Il nous montre également une vidéo de 1995, avec James Gosling présentant un prototype de PDA avec des interactions proches des smartphones récents, notamment la navigation dans les menus, l’écran tactile, un véritable iPhone préhistorique.
Danny insiste fortement sur l’effort de modularisation de la JVM, illustré par le projet Jigsaw, pour améliorer la taille de la JVM et sa rapidité de démarrage. Il nous parle également de la gestion du parallélisme avec le récent travail sur le garbage collector G1, mais aussi de l’API fork/join et ParallelArray sur laquelle nous reviendrons en détails.
Danny nous parle également du grand nombre de langages qui tournent sur la JVM : près de 200. Il met en lumière le projet Da Vinci Machine, destiné à fournir des optimisations bas niveau aux langages tiers pour obtenir des performances proches de Java sur tous les langages tournant sur la JVM.
Puis viennent toutes les nouveautés du langage attendues prochainement :
- nouvelles annotations,
- amélioration de l’inférence de type pour les Generics (mieux connu sous le nom de ‘diamond operator’)
- possibilité de catcher plusieurs exceptions à la fois,
- supports des chaines de caractères pour les commandes switch/case,
- support des closures à travers le projet Lambda.
Danny consacre également beaucoup de temps pour nous parler de JavaFX. Il a tenu à rappeler que JavaFX est bien vivant, la preuve en est qu’il y a eu 4 releases en 18 mois. Parmi les nouveautés de la version 1.3 on peut noter :
- l’arrivée de nouveaux composants graphiques plus scalables,
- la nouvelle stack graphique nommée Prism,
- des optimisations : il annonce un démarrage 2 à 3 fois plus rapide sur un Java SE 6 update 18,
- JavaFX TV : annoncé comme nouveauté mais déjà présent dans la version 1.2, avec son émulateur de TV.
Et pour finir cette keynote de lancement, il nous fait la démonstration d’une partie du site des JO de Vancouver 2010, écrite avec JavaFX.
Si l’on se replonge dans les sessions de l’année dernière, il est troublant de voir que les sujets abordés dans cette keynote sont exactement les mêmes que ceux abordés par James Gosling et Danny Coward l’an passé, au même endroit (si l’on omet l’omniprésence de JEE6 en 2009). Si nous étions taquins, on pourrait presque dire que cette keynote d’ouverture est un copier / coller de celle de l’année dernière. Et si nous étions vraiment irrévérencieux, nous dirions que depuis un an, Sun / Oracle n’a pas grand chose à annoncer concernant Java.
Client / Server 2.0 with Java and Flex
James Ward nous présente les interactions entre le monde Flex et le monde Java. James revient sur toutes les méthodes de communication, d’une jsp renvoyant du contenu en xml, en passant par les appels SOAP, jusqu’à l’utilisation des annotations fournies dans spring-blazeds.
L’annotation @RemotingDestination
permet d’exposer automatiquement un service Java vers le monde Flex en utilisant le protocole AMF.
Il insiste également sur le coût du parsing de chacun des formats. AMF est peu coûteux en CPU et en mémoire comparé au parseur XML. Ce point peut être important dans le cadre de clients Flash sur mobile, ne possédant pas la même puissance de calcul et de mémoire qu’un desktop. Pour conclure, James nous présente Flash sur un téléphone Android.
Frameworks and security : how they kill your security scanning
Christian Hang, de chez Armorize Technologies, nous fait part de son point de vue sur les problèmes d’audit de sécurité posés par l’utilisation des frameworks. Il commence par un rappel assez complet sur la sécurité en général et les méthodes de détection de failles :
- black box testing : simulation d’attaques extérieures
- white box testing : analyse statique de code pour trouver des failles potentielles (ou SCA : Static Code Analysis)
- analyse dynamique : mise en place d’agents ou de moniteurs sur une application en fonctionnement pour tracer les failles
Il expose rapidement les risques de détection de faux positifs et faux négatifs et leurs conséquences avant d’approfondir sur l’analyse statique de code et ses limites. C’est là qu’arrivent les frameworks et le défi lancé aux outils de SCA. En effet, la forte utilisation de fichiers configuration casse la chaine d’invocation que tentent de suivre les outils de SCA. Comme chaque framework possède ses propres normes de configuration, il est très complexe de poser une méthode générique. De plus comme les frameworks sont des librairies tierces, la chaine d’invocation va se perdre au sein d’un jar et oblige à inspecter le framework en lui-même et non l’application seule. Il nous fait la démonstration de son propos avec le déroulement d’une requête dans Struts.
Christian termine en exposant les solutions qu’il entrevoit à ces problèmes, à savoir la génération de code source ‘glue’, basée sur les fichiers de configuration, qui permette aux outils actuels de SCA de continuer à suivre la chaine d’invocation jusqu’au bout. Ce code ‘glue’ serait injecté avant le passage de l’analyse de code et évidemment pas committé sur l’application.
Avec ses propositions, Christian nous ouvre de nouvelles perspectives d’améliorations pour les outils de SCA. Il y a du chemin à faire mais le gain en détection automatique de failles est potentiellement énorme.
Object of value
Première présentation de la journée pour Kevlin Henney. Il revient sur le concept de Value Object en insistant beaucoup sur la différence fondamentale qui existe entre une Valeur et son implémentation.
L’exemple le plus parlant qu’il donne est celui d’un md5 de fichier. Pour être manipulé, nous aurons sûrement tendance à le stocker dans un String
, mais fondamentalement, ce n’est pas une quelconque chaîne de caractères, c’est un MD5
qu’on souhaite manipuler. Ce qui devrait se traduire par la création d’un Value Object MD5
.
Pour un rappel sur ce concept, vous pouvez vous pencher sur ce blog.
Kevlin Henney nous invite à réfléchir à la meilleure façon de manipuler des Valeurs dans nos programmes et non un énorme assemblage de String et de numériques.
Nous reparlerons prochainement de ses idées sur la question.
Construction techniques for domain specific languages
Neal Ford, de ThoughtWorks, nous parle de l’élaboration de DSL et des outils les plus adaptés à cela. Après un rappel sur les motivations de l’écriture de DSL et la différence fondamentale entre une API et un DSL, il nous livre ses cinq clés pour l’élaboration de DSL :
- langage de programmation
- langage naturel, proche d’un langage oral
- focalisé sur un aspect particulier du domaine
- expressivité limitée
- ne doit pas être Turing-complet
Il tente alors une approche des principes exposés en Java, code à l’appui. De son point de vue, il n’est pas possible de réaliser de vrais DSL en Java pur. Ce qui s’en rapproche le plus est le method chaining, qui consiste à retourner this
à la fin de chaque méthode pour pouvoir enchainer les appels. Un bon exemple illustrant ce principe est l’API Criteria d’Hibernate :
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.between("weight", minWeight, maxWeight) ) .list();
Puis il passe au langage Groovy, qui lui semble bien plus adapté que Java pour ce cas de figure. Certains aspects de Groovy facilitent la tâche :
- le typage dynamique
- les closures
- 2 techniques de classes ouvertes : les Categories, et les MetaClasses
Ce qui amène Neal a parler de EasyB, projet codé en Groovy pour rédiger des spécifications en BDD, de la forme :
given "an invalid zip code", { invalidzipcode = "221o1" } and "given the zipcodevalidator is initialized", { zipvalidate = new ZipCodeValidator() } when "validate is invoked with the invalid zip code", { value = zipvalidate.validate(invalidzipcode) } then "the validator instance should return false", { value.shouldBe false }
EasyB étant basé sur RSpec, un projet BDD pour Ruby, Neal enchaîne naturellement sur les avantages de ce langage pour la rédaction de DSL, à savoir :
- classes ouvertes
- aliasing de méthodes
- polishing, méthodes de nettoyage de code ‘presque’ Ruby en ‘vrai’ Ruby.
Pour information, il est tout à fait possible de réaliser ses DSL en Ruby et de les faire exécuter en Java, grâce à JRuby. Neal nous livre donc son choix pour les DSL : Ruby. Et il termine sa présentation en rappelant les éléments indispensables à conserver en tête lors de la rédaction de DSL :
- c’est un langage de programmation limité à un aspect du domaine.
- construire par composition et non par élaboration : il vaut mieux faire beaucoup d’opérateurs simples qu’on composera en utilisant le DSL.
- démarrer par la fin : il faut poser la syntaxe que l’on souhaite obtenir dès le début et créer le DSL de façon à respecter cette syntaxe.
- évolution, pas révolution : un DSL se construit petit à petit, il ne faut pas espérer penser tous les opérateurs dès le début, les besoins apparaitront à l’usage.
Servlet 3.0
Ravij Mordani présente la spécification Servlet 3.0, introduite dans la plateforme JEE6. Il nous présente les améliorations selon quatre axes qui reflètent le nouveau visage des Servlets.
Facilité de développement
Profite des améliorations de Java 5, comme les annotations.
On peut directement annoter une servlet plutôt que de devoir la configurer dans le fichier web.xml. Le très verbeux
com.servlet.HelloWorldServlet HelloWorld HelloWorld /hello-world
devient donc
@WebServlet(urlPatterns="/hello-world") public class HelloWorldServlet extends HttpServlet
On notera qu’il est toujours obligatoire d’étendre HttpServlet
et de fournir une implémentation aux méthodes doGet
, doPost
, etc.
De la même manière, on peut définir des Filter
ou des ContextListener
directement par annotations. Le fichier de configuration web.xml devient optionnel, les annotations suffisent. Si toutefois vous le voulez, vous pouvez écrire un fichier web.xml, qui surchargera alors les directives des annotations.
La configuration peut également être faite de façon programmatique, grâce à une nouvelle API, mais uniquement au chargement du contexte.
context.addServlet(String servletName) context.addServlet(String className) context.addServlet(Class> servletClass) context.addServlet(Servlet servlet) ...
Pluggabilité
La notion de web-fragment fournit un moyen de partitionner le descripteur de déploiement. On peut directement fournir de la configuration dans un jar, en plaçant un fichier nommé web-fragment.xml dans META-INF. De la même manière on peut intégrer des JSP dans les jars dans le répertoire META-INF/resources/.
La notion de plug-in de container apparait également. Elle est déjà utilisée notamment par les implémentations de référence JSF (Mojora) et JAX-RS (Jersey).
Exécution asynchrone
L’exécution asynchrone de servlet permet de s’affranchir du pattern Thread by request. Les requêtes demandant un traitement long au back-end, telles que des requêtes bases de données couteuses ou les appels à des systèmes externes de type webservice, peuvent désormais être facilement exécutées de manière asynchrone. Cela permet de rendre le thread disponible pour le traitement des autres requêtes.
Cette fonctionnalité est également très utile pour le développement de fonctionnalités poussant des données vers le client. Le thread n’est plus en permanence bloqué pour un client, mais uniquement lors de l’arrivée d’un évènement.
Pour que le mode asynchrone fonctionne, il faut que toute la chaîne de traitement soit effectivement compatible (filtres, servlets…).
Sécurité
Un ensemble d’annotations permet désormais de gérer le contrôle d’accès à une servlet. On peut également obliger l’utilisation d’un protocole sécurisé (HTTPS) pour l’appel à la servlet. Les 4 annotations suivantes : @DenyAll
, @PermitAll
, @RolesAllowed
, @TransportProtected
pourront être utilisées sur les méthodes traitant les requêtes dans HttpServlet
(doGet
, doPost
et les autres) ou bien directement sur la classe.
@WebServlet(urlPatterns="/secure/hello-world") @RolesAllowed("authentified") @TransportProtected public class HelloWorldServlet extends HttpServlet
Il est aussi possible d’implémenter directement la méthode d’authentification HttpServletRequest.login(String username, String password)
;
97 faits que tout programmeur devrait connaître
Pour clore la journée, tout le monde se regroupe dans la salle 5 (la plus grande) pour écouter Kevlin Henney présenter quelques conseils extraits du livre publié par O’Reilly 97 things every programmer should know
Le livre étant très conséquent, il a choisi de se focaliser sur :
- Apprenez à estimer : Learn to estimate
- Ne commentez que ce que le code ne dit pas : Comment only What the code cannot say
- Encaspulez un comportement, pas seulement un état : Encapsulate behavior not just state
- La règle du boyscout : The boy scout rule (Try to leave this world a litte better than you found it…)
- Le test est la rigueur professionnelle du développement logiciel : Testing is the Engineering rigor of software development
- Écrivez des tests accessibles aux autres : Write test for people
Les anecdotes et la verve de Kevlin nous font passer un très bon moment, avant de nous rendre au Jazoon Networking Event, où tous les participants peuvent souffler un peu autour d’un verre, partager leurs impressions sur les différentes sessions de la journée, ou discuter avec les speakers.
Commentaire
1 réponses pour " Jazoon’10 – Jour 1 "
Published by Etienne Neveu , Il y a 13 ans
Pour les Value Objects, j’avais bien aimé cette présentation:
http://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson
On dirait que c’est un sujet à la mode à Jazoon, Dan avait fait une autre présentation sur les Value Objects / DDD à Jazoon 2009:
http://blog.engineering.publicissapient.fr/2009/06/24/jazoon-jour-2-ddd-et-value-objects/