18490 items (17901 unread) in 65 feeds
BlogspersosFR
(1209 unread)
BlogsEntreprisesFR
(1423 unread)
JavaJEE
(5134 unread)
Diversdev
(5352 unread)
Videos
(200 unread)
Agiles
(1853 unread)
divers
(866 unread)
Wicket
(56 unread)
Spring
(31 unread)
Architecture
(293 unread)
BlogspersosAutre
(470 unread)
BlogsEntreprisesAutre
(1014 unread)
BlogspersosFR (100 unread)

Les parisiens sont arrivés jeudi soir. Nous étions 25 à se retrouver avec plaisir sur le port de la Rochelle. Après une soirée bien animée, la journée a débuté ce matin par la présentation d’Emmanuel Bernard sur les Communautés.
Emmanuel travaille chez JBoss RedHat. Actif dans la communauté, il est aussi l’instigateur du podcast « Les CastCodeurs ». Il contribue aussi à la communauté Hibernate, et c’est donc avec un oeil avisé qu’il nous parle des communautés ce matin.
Première prise de conscience : vous faîtes du Java ? vous utilisez Scrum ? vous aimez C# et le monde .NET ? Sans le savoir vous faîtes déjà partie d’une communauté. Que vous soyez fan de Starcraft2, commiter Maven, membre du JCP ou sur les réseaux sociaux comme Facebook ou autre : vous appartenez à des communautés.
Une communauté est un ensemble de personne qui partage et utilise un patrimoine commun. Une communauté est formée indépendamment de la volonté de ses membres. Emmanuel explique qu’ils ne décident pas de leur implication.
C’est un terme assez galvaudé. Il explique que chaque communauté a finalement un contrat explicite ou implicite. Les relations sont souvent asymétriques, mais les communautés qui marchent le mieux sont celles où la hiérarchie et légère et naturelle.
Pour qu’une communauté marche, il faut qu’elle soit ouverte dès le premier jour. Sur JBoss et les forums, à un moment donné les personnes de JBoss étaient perçues comme un peu glaciale, à force de répéter sans cesse les mêmes choses. En laissant la communauté s’auto-gérer, les forums ont repris de l’intérêt, et ils fonctionnent encore très bien.
Emmanuel propose une approche collaborative. Il fait une analogie entre Git et Svn. L’approche Git appliquée à une communauté est plus moderne. Cela supprime l’asymétrie et le côté monarchique.
Dans une communauté, chacun prend un rôle plus ou moins actif. Il y a le créateur bienveillant, celui qui a sa photo dans le hall d’entrée, ou celui qui s’oppose à Oracle et qui lance ses teeshirts. Il y a les leaders reconnus. Je reconnais là la notion de Leader, que l’on peut découvrir dans le livre « Tribus » de Seth Godin. Emmanuel, c’est un petit livre à lire qui est sympa.
Les contributeurs ensuite, sont actifs et apportent à la communauté. Les participants sont plus ou moins actifs. Enfin il y a la majorité des gens qui utilisent sans intervenir, et il y a aussi les supers lourds qui remplissent les forums et les listes de diffusions, sans jamais produire quelque chose de positif. Oui il y a des Supers Connards, mais cela ne représente qu’une minorité…
Pourquoi s’impliquer dans les communautés ? En fait dans cette partie, Emmanuel essaye de comprendre pourquoi les gens s’investissent. Quelles sont leurs motivations ?
La reconnaissance des autres, le plaisir de partager avec d’autres personnes ses idées par exemple. Peut-être ensuite un intérêt financier, en devenant expert dans la communauté.
Il y a aussi la croyance en quelque chose. Emmanuel explique que l’objectif des CastCodeurs est de monter aux développeurs qu’ils peuvent occuper une place active dans leur entreprise, et qu’ils ont de l’or dans les mains. J’ai bien aimé cette réflexion, et je pense que j’en reparlerai en octobre à Soft-Shake.
Pour terminer, Emmanuel nous encourage, et vous encourage à participer à la communauté. Je le rejoins complètement. Laissez tomber le côté TV, où vous consommez des blogs, des sessions des Users Groups, et essayez de trouver quelque chose à faire. Cela peut être en écrivant du code, en préparant une présentation, en s’impliquant dans la formation de vos collaborateurs ou en faisant une veille active, avec restitution.
Je le rejoins aussi sur l’idée où plus tu t’impliques dans la communauté, plus tu y gagnes.

Spring Roo est un outil de création d’application rapide proposé par Ben Alex, l’un des contributeurs de la société SpringSource. Avec une utilisation d’AspectJ très poussée, c’est un environnement de génération rapide, qui propose de construire rapidement une appication Web. Premières impressions et premières réflexions, c’est parti !
Spring Roo est distribué dans Spring STS ou sous la forme d’une archive à installer. Après avoir ajouté le répertoire bin de Spring Roo à votre PATH, vous pouvez alors le lancer en ligne de commande. Celui-ci démarre et propose une interface type terminal toute simple. Imaginez un terminal Linux, où des commandes shells vous permettent de générer le squelette de votre application MVC, vous y êtes. Le code généré est du Java et des fichiers .aj pour la partie Aspect. Les fichiers sont organisés autour d’un projet Maven, ce qui permet de travailler avec son IDE sans problèmes.

L’utilisation de Roo est simple. J’ai trouvé que l’outil en ligne de commande était bien fait. Plus simple à prendre en main que Grails pour les débutants, il vous faudra quelques minutes à peine pour comprendre son utilisation.
Si vous lancez d’ailleurs votre éditeur Java, et que vous laissez Spring Roo en tâche de fond, celui-ci surveille le code source de votre projet. La programmation « roundtrip » est donc possible, modulo le fait que vous soyez obligé de relancer votre serveur web dès que vous modifiez la structure Java. Des annotations placées dans le code permettent de générer des Aspects. Roo utilise AspectJ.
Voici par exemple une class générée avec Roo :
package org.letouilleur.test.domain;
import javax.persistence.Entity;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.tostring.RooToString;
import org.springframework.roo.addon.entity.RooEntity;
import javax.validation.constraints.NotNull;
@Entity
@RooJavaBean
@RooToString
@RooEntity
public class JobPost {
@NotNull
private String title;
private String instructions;
}
Les annotations de Roo sont avec une rétention de type Source. Ce sont donc des annotations qui ne sont utilisées que lors de l’écriture du code dans votre IDE, ou donc via Roo. Cela a pour conséquence que Roo n’est pas une librairie ou un framework à l’exécution. C’est le socle Spring MVC et Webflow, sur une couche JPA ou autre, bref que du classique. Il n’y a pas de dépendances à l’exécution. A part du code source différent, le résultat est donc le même.
Chaque annotation commence par @Roo ce qui permet de les identifier rapidement. De long débat sur l’utilité d’avoir un aspect pour ce qui est toString animent la blogosphère… Moi je dis pourquoi pas ?
Chaque annotation génère un aspect dans un fichier .aj au même niveau que votre classe.
L’annotation @RooToString génère par exemple cet aspect dans un fichier JobPost_Roo_ToString.aj :
// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO.
// You may push code into the target .java compilation unit if you wish to edit any member(s).
package org.letouilleur.test.domain;
import java.lang.String;
privileged aspect JobPost_Roo_ToString {
public String JobPost.toString() {
StringBuilder sb = new StringBuilder();
sb.append("Id: ").append(getId()).append(", ");
sb.append("Version: ").append(getVersion()).append(", ");
sb.append("Title: ").append(getTitle()).append(", ");
sb.append("Instructions: ").append(getInstructions());
return sb.toString();
}
}
Finalement, chaque « concern » de mon entité est stocké sous la forme d’un Aspect, au même niveau que celui-ci.
Pas de DAOSpring Roo suit la même philosophie que Play! Framework, à savoir utiliser le pattern Active Record. Il n’y a pas de DAO, et une explication bien fournie dans la documentation vous explique pourquoi. Encore une fois, c’est plus une approche de développement qu’une histoire de bien ou pas bien.
En quelques mots, comme je vous l’avais montré avec JPA, Spring Roo prend une approche où l’entité n’est pas anémique, mais riche. Chaque entité est capable d’interagir avec la base de données. Vous n’avez pas de DAO, ni de services. Le Controller effectue essentiellement un passage d’argument vers l’entité, qui est celle qui fonctionne avec la base de données.
Pour cela, Roo place dans un aspect tout ce qui est lié à la gestion de la Persistance. Cela permet d’ajouter des finders dynamiques comme avec Grails, chose qui n’est pas possible avec Play! Framework.
Regardez le code de l’aspect JobPost_Roo_Entity.aj :
// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO.
// You may push code into the target .java compilation unit if you wish to edit any member(s).
package org.letouilleur.test.domain;
import java.lang.Integer;
import java.lang.Long;
import java.lang.SuppressWarnings;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PersistenceContext;
import javax.persistence.Version;
import org.letouilleur.test.domain.JobPost;
import org.springframework.transaction.annotation.Transactional;
privileged aspect JobPost_Roo_Entity {
@PersistenceContext
transient EntityManager JobPost.entityManager;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long JobPost.id;
@Version
@Column(name = "version")
private Integer JobPost.version;
public Long JobPost.getId() {
return this.id;
}
public void JobPost.setId(Long id) {
this.id = id;
}
public Integer JobPost.getVersion() {
return this.version;
}
public void JobPost.setVersion(Integer version) {
this.version = version;
}
@Transactional
public void JobPost.persist() {
if (this.entityManager == null) this.entityManager = entityManager();
this.entityManager.persist(this);
}
@Transactional
public void JobPost.remove() {
if (this.entityManager == null) this.entityManager = entityManager();
if (this.entityManager.contains(this)) {
this.entityManager.remove(this);
} else {
JobPost attached = this.entityManager.find(this.getClass(), this.id);
this.entityManager.remove(attached);
}
}
@Transactional
public void JobPost.flush() {
if (this.entityManager == null) this.entityManager = entityManager();
this.entityManager.flush();
}
@Transactional
public JobPost JobPost.merge() {
if (this.entityManager == null) this.entityManager = entityManager();
JobPost merged = this.entityManager.merge(this);
this.entityManager.flush();
return merged;
}
public static final EntityManager JobPost.entityManager() {
EntityManager em = new JobPost().entityManager;
if (em == null) throw new IllegalStateException("Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)");
return em;
}
public static long JobPost.countJobPosts() {
return ((Number) entityManager().createQuery("select count(o) from JobPost o").getSingleResult()).longValue();
}
@SuppressWarnings("unchecked")
public static List<JobPost> JobPost.findAllJobPosts() {
return entityManager().createQuery("select o from JobPost o").getResultList();
}
public static JobPost JobPost.findJobPost(Long id) {
if (id == null) return null;
return entityManager().find(JobPost.class, id);
}
@SuppressWarnings("unchecked")
public static List<JobPost> JobPost.findJobPostEntries(int firstResult, int maxResults) {
return entityManager().createQuery("select o from JobPost o").setFirstResult(firstResult).setMaxResults(maxResults).getResultList();
}
}
L’aspect est ajouté sur la classe JobPost. J’ai testé la completion dans SpringSource STS et ça marche plutôt bien. C’est du Grails, avec un typage fort pratique et agréable à utiliser. Avec un Mac, j’ai un peu galéré avec l’outil intégré dans Roo, le Ctrl-Espace ou Pomme-Espace pour la complétion dans STS n’est pas utilisable. Je trouve qu’il est plus pratique de travailler en ligne de commande dans un xterm. Sur Windows par contre cela marche bien.
Le controleur généré pour lister l’ensemble de mes offres d’emplois est simple :
package org.letouilleur.testroo.web;
import org.springframework.roo.addon.web.mvc.controller.RooWebScaffold;
import org.letouilleur.testroo.domain.JobPost;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
@RooWebScaffold(path = "jobposts", formBackingObject = JobPost.class)
@RequestMapping("/jobposts")
@Controller
public class JobPostController {
}
J’ai essayé d’ajouter un field sur une Entité sans relancer Tomcat, mais cela ne marche pas. Par rapport à Play! Framework vous devez relancer votre serveur. J’ai essayé plusieurs fois, mais je pense que la partie Aspect redemande une compilation. Nous parlons d’annotations avec une rétention au niveau source, cela semble logique.
Des modules ? des plugins ?Spring Roo permet de mettre en place des aspects comme la sécurité, l’indexation avec SolarR des entités, ou même l’envoi d’un email. Il est aussi possible de développer ses propres outils par exemple.
L’intégration avec Google GWT et Google App Engine est particulièrement poussée. De même que l’outil Cloud Foundry, qui appartient à SpringSource et qui permet de gérer facilement la plate-forme de cloud d’Amazon.
Ce que j’ai aiméLe contrat est rempli : en quelques minutes vous générez une application web sur un socle Spring, avec une approche très Domain Driven Design qui me plaît beaucoup. Bye bye DAO et Service, c’est une approche plus Web que j’aime bien. La mise en place d’un projet complet avec Maven est bien pensée. Le fait que ce soit du Java est un plus par rapport à Grails pour ceux qui ne connaissent pas encore Groovy.
Dans le cadre de la réalisation d’une application Web, c’est un choix à regarder. Je n’ai pas creusé ensuite l’implémentation dans la partie Controller. L’Add-on Web MVC de Spring Roo génère l’ensemble des méthodes type CRUD. Par contre vous ne les voyez pas dans le code de votre controleur. Ce sont des Aspects qui sont ajoutés ensuite dans la classe finale.
Spring Roo et Play! Framework font tous les deux de l’enrichissement de vos classes. Roo utilise des Aspects, Play! utilise le compilateur incrémental JDT d’Eclipse (pas l’IDE). L’avantage de Play! est qu’il déclare des méthodes dans les classes comme JPASupport ou Model, que vous étendez ensuite dans votre entité. Ceci permet d’avoir de la complétion lorsque vous codez. Votre IDE connaît les méthodes et vous ne perdez pas le typage fort. Ces méthodes sont implémentées lors de la compilation, qui est fait par Play! au lieu d’être fait via Maven ou votre IDE.
La liste des Add-On est déjà bien avancée, et nous n’en sommes qu’à la version Spring Roo 1.0.0.M3. Il y a une bonne communauté déjà semble-t-il.
Un point fort c’est que Roo ne vous locke pas, puisque l’essentiel de l’outil est constitué d’annotations, d’aspect et d’un outil qui surveille votre arborescence de code.
Ce que j’ai moins aiméLe support dans IDEA IntelliJ est pas top. Lorsque vous codez des pages JSF par exemple, pas de complétion possible avec les actions de votre controleur lorsque vous référencez votre bean. Ce n’est pas la fin du monde, mais on perd du temps. Le support dans l’outil SpringSource STS est bien meilleur. Je vous conseille de le tester et de laisser tomber IDEA IntelliJ ou NetBeans avec Spring Roo pour l’instant.
A priori le support des Aspects dans IDEA 9 avec la version 1.0.0.M3 semble fonctionner. Cela vous permet par exemple d’avoir la complétion des getters/setters sur votre entité au sein du code de votre Controller. Mes derniers essais avec IDEA 9.0.3 professional edition n’était pas concluant, car cela ne marchait pas. Je testerai à nouveau, car sans cette fonctionnalité, et bien Spring Roo perd de son intérêt.
Ne vous amusez pas à changer la structure des packages, ou à essayer de déplacer vos entités dans un autre projet Maven. Comme Grails et comme Play! Framework, il faut accepter un certain cadre pour que l’outil fonctionne. Donc si vous êtes un ayatollah de l’architecture, ben ce sera pas trop votre ami. C’est le même souci avec tous ces outils comme Play! ou Grails.
J’ai un mauvais souvenir de Grails et de la partie CRUD, où finalement j’avais terminé par faire mes pages, mes actions et mes tags. J’ai un mauvais souvenir du module CRUD de Play! qui ne couvre pas mes besoins, et qui n’est pas fait pour être surchargé (encore moins que Grails).
Donc forcément, je n’ai pas mis le nez dans les JSPx, mais je sens que pour faire une vraie application la partie CRUD ira aussi à la benne. On s’en sert pour montrer les bonnes pratiques, mais pour faire une vraie application ? Je me base sur l’exemple de la Pizzeria de la doc de Roo pour appuyer cet argument : j’y crois pas sur une application réelle sur le Web (…genre un jobboard où tu as bossé 5 mois dessus tu vois…)
J’ai reposé le crayon après avoir généré mon squelette de code, et je n’ai pas tellement testé la construction d’un vrai projet (je vous le dis honnêtement). J’aime bien essayer de gérer les relations OneToMany/OneToOne/ManyToMany et voir comment s’en sort le framework. Grails avec GORM est particulièrement bon, cette partie est mature. Chez Play! Framework c’est JPA, donc le framework ne fait rien de plus que ce que vous feriez par ailleurs. Ce sera à vous de coder cette partie. Côté Spring Roo, vous pouvez déclarer des relations entre vos entités, et Roo vous aide à les mettre en place. A voir ensuite du côté de la vue comment cela fonctionne.
Je n’ai pas testé la partie tests unitaires et tests d’intégrations avec Selenium, qui me semble bien fait. Cela fait bizarre de faire tester par Roo du code qu’il a lui-même écrit…
Enfin à priori l’outil ne générera pas de code avec des beans Java EE 6 ou CDI. Par contre la partie JPA fonctionne très bien.
ConclusionSpring Roo est un outil de productivité, qui a le mérite de proposer de bonnes pratiques, et un socle purement basé sur Spring. Pour écrire une application avec un noyau Spring franchement essayez-le. Simple à mettre en place, l’essai ne vous coûte pas cher.
Dans les demandes des utilisateurs, une demande ouverte en 2009 et qui est en cours de traitement porte sur la reprise des JSP modifiées par Spring Roo (voir ROO-8). C’est quelque chose qui est bien traité dans Grails, et je trouve que Roo s’aventure sur un terrain où il y a déjà 2 ans de travail. Grails est vraiment une belle machine, et il tourne bien.
Prenez le temps de tester et de vous faire votre propre opinion, c’est un bon outil.
Références
- Lisez la documentation de référence, la philosophie de l’outil est bien expliqué.
- Le site d’AspectJ
- Why Spring Roo is not my thing ? Bon article sur le blog GridShore
- Spring Roo sucks ! : les arguments sont un peu léger, et il y a un peu de mauvaise foi.
- Spring Introduction in 10mn sur le site d’InfoQ
- Spring Roo : the answer to rapide development ? sur DZone
With Grizzly at the heart of GlassFish since 2.x and offering great HTTP performance, I see a number of users simply go without any front web server (when network topologies allows for this). This would mean that GlassFish can be exposed directly on the internet. For security reasons (trying not to help hackers), it may be a good idea to not tell the world which server you are using. This is what a user has been recently asking on the forums.
By default, GlassFish returns two HTTP headers that may disclose that GlassFish is the server used:
% curl -I http://localhost:8080
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0
Server: GlassFish Server Open Source Edition 3.0.1
Both headers can be changed with GlassFish. Read on to see how to do so with version 3.0.1.
Let's start with "X-Powered-By". To change this you need to set the xpowered-by HTTP listener property to false (default is true to conform to the Servlet specification). To change this you can use the admin console (Configuration > Network Config > Network Listeners > http-listener-1 > HTTP). But you could also do it the CLI way using the dotted notation in a single command :
asadmin set server.network-config.protocols.protocol.http-listener-1.http.xpowered-by=false
You can also point your HTTP client to this RESTful admin URL: [localhost:4848] and emit a POST to change the xpowered-by property. With no restart required, you should now see the following complete HEAD response (no more X-Powered-By) :
% curl -I http://localhost:8080
HTTP/1.1 200 OK
Server: GlassFish Server Open Source Edition 3.0.1
Accept-Ranges: bytes
ETag: W/"5212-1259789398000"
Last-Modified: Wed, 02 Dec 2009 21:29:58 GMT
Content-Type: text/html
Content-Length: 5212
Date: Tue, 07 Sep 2010 10:02:27 GMT
Update: I'm also reminded that you can control the presence of this header X-Powered-By using web.xml for a per-application setting or using the domain/config/default-web.xml file. In both cases, you'll need to set the servlet's xpoweredBy init-param to false.
The second part, maybe the most important, is the "Server" HTTP header which can be both modified or removed altogether. This involves adding a Java property which means that changes made will require a server restart. The magic property is called product.name. Again, you could use the admin console to change this (Configuration > JVM Settings > JVM Options) or go the command-line route:
% asadmin create-jvm-options -Dproduct.name="My little server"
% asadmin restart-domain
Successfully restarted the domain
Command restart-domain executed successfully.
% curl -I http://localhost:8080
HTTP/1.1 200 OK
Server: My little server
Accept-Ranges: bytes
ETag: W/"5212-1259789398000"
Last-Modified: Wed, 02 Dec 2009 21:29:58 GMT
Content-Type: text/html
Content-Length: 5212
Date: Tue, 07 Sep 2010 10:20:16 GMT
Finally you can remove the "Server" header altogether by setting the property to an empty string :
% asadmin create-jvm-options -Dproduct.name=""
% asadmin restart-domain
Successfully restarted the domain
Command restart-domain executed successfully.
% curl -I http://localhost:8080
HTTP/1.1 200 OK
Accept-Ranges: bytes
ETag: W/"5212-1259789398000"
Last-Modified: Wed, 02 Dec 2009 21:29:58 GMT
Content-Type: text/html
Content-Length: 5212
Date: Tue, 07 Sep 2010 10:20:36 GMT

C’était le 12 août dernier. Oracle Corporations attaque Google pour la violation de 7 brevets autour de Java. Le souci tourne autour de Dalvik, la machine virtuelle de la plate-forme Android, qui tourne peut-être dans votre poche si vous avez un téléphone Android. Google accuse Oracle d’attaquer la communauté open-source, et se retire de la conférence Java One qui aura lieu mi-septembre. Les blogs s’enflamment, Oracle est le méchant et Google et le gentil. Merci au revoir et bonne journée.
Oracle en fait n’a pas la même approche que SUN Microsystems. A mon avis, si je me place du côté d’Oracle, je pense que c’est une bonne chose que de défendre l’esprit de Java : write once, run everywhere. Après tout, pourquoi ne pas aussi râler que la plate-forme Google App Engine ne permette pas d’utiliser toutes les classes Java ? Oui c’est vrai non ? Dalvik est une machine virtuelle qui grâce à son approche, permet d’offrir un noyau performant pour les téléphones mobiles. Cependant, ce n’est ni une implémentation de Java SE, ni de Java ME. Bref Google a fait le bon choix technique, à savoir construire un noyau à même de répondre aux problèmes de l’environnement mobile. Apple de son côté ne s’y est même pas essayé. Si vous voulez écrire une application pour iPhone, vous devez apprendre l’objective C pour l’instant.
La passe d’arme d’Oracle serait donc justifiée, dans l’idée de défendre les valeurs de la plateforme Java. L’homme est de retour, planquez-vous mes amis. Mais personnellement j’ai un peu de mal à y croire.
Je crois plus simplement à un simple et belle histoire de gros sous. Les brevets sont une source de revenu aux USA. Ils font vivre des petites entreprises, voire même des coquilles vides. Prenons un groupe « G » qui créé une structure en France et une autre aux Etats-Unis. Une entreprise Française peut être par exemple « centre de recherche et de développement« . En effectuant des dépenses justifiées, elle peut bénéficier du crédit impôt recherche, une enveloppe qui lui permet de s’aider financièrement. Ensuite, ce qu’elle développe est cédé à une entreprise Américaine (du même groupe), qui peut poser des brevets sur certains concepts et se charge de l’exploitation. La société Française ne génère que du revenu sur sa propriété intellectuelle, et l’entreprise Américaine peut alors vendre des licences logicielles. C’est un business modèle que j’ai étudié et vécu en 2000 et qui est toujours d’actualité.
Oracle ne souhaite pas je pense que Google abandonne Java pour sa plateforme mobile. Ce serait un revers terrible pour Java en général, que de se faire désavouer de cette plateforme. Regardons le marché aujourd’hui : dominé par Apple, Android est la seule alternative qui fonctionne et qui amène un moyen différent, libre et plus ouvert pour développer sur mobile. Et je vous le dis aujourd’hui : demain votre télé sera sur Android, et après-demain vous aurez un écran LCD pour twitter dans les toilettes avec iOS ou Android. Le web des objets, machin truc, bref vous savez tout cela déjà .
Si Oracle souhaitait vraiment bloquer Google, ce sera au bénéfice d’Apple je pense. Ce n’est pas forcément délirant, dans le sens où le marché du mobile, et le succès de l’iOS, risque de générer des bénéfices énormes dans les 5 ans qui viennent. Un élément de réponse se trouve dans la plainte d’Oracle. Dans l’hypothétique cas où Google ne serait pas d’accord pour céder avec un accord financier, et qu’Oracle gagne ensuite le procès, il faudrait que Google retire les parties qui enfreignent ces brevets de Dalvik. Est-ce que c’est possible ? J’ai envie de croire que non. Donc Google sera amené à payer de lourdes indemnités à Oracle.
Alors Oracle attaque Google, qui n’est pas tout blanc. La communauté Java est toujours un peu groggy après le rachat de SUN par Oracle, et se demande ce qui l’attend. Oracle est peut être plus à même de conserver l’idée de Java après tout. Les podcasteurs des JavaPosses dans l’épisode 322 se disent que Google aurait pu acheter Sun finalement, ce qui leur aurait donné moins de soucis.
Lorsque l’on regarde la liste des brevets, je me dis qu’il ne manque plus que le brevet sur le point virgule pour bien rigoler :
* Protection Domains to Provide Security in a Computer System (2000)
* Controlling Access to a Resource (2000)
* Method and Apparatus for Preprocessing and Packaging Class Files (1999)
* System and Method for Dynamic Preloading of Classes through Memory Space Cloning of a Master Runtime System Process (2008)
* Method and Apparatus for Resolving Data References in Generate Code (2003)
* Interpreting Functions Utilizing a Hybrid of Virtual and Native Machine Instructions (2005)
* Method and System for Performing Static Initialization (2000)
Encore une fois donc, une histoire d’argent plus qu’autre chose. Cette action est par contre le moyen pour Oracle d’affirmer sa présence désormais dans l’univers des brevets de la plate-forme Java. Avis aux autres fabricants de téléphone portable, ça peut chauffer pour vous aussi.
Comme je dis souvent : what else ?
Références
Episode 322 des JavaPosses
Pourquoi Oracle a eu raison d’attaquer Google (en anglais)
Oracle’s android lawsuit : pandora’s box serious evils ? (en anglais)

Hop jeudi soir je prends le TGV, le temps de descendre de Paris jusqu’à la Rochelle, de garer le train en double-file et je serai à la Rochelle pour ne pas louper le premier JUG Summer Camp.
La conférence a lieu ce vendredi 10 septembre, toute la journée. C’est gratuit, donc tu n’as pas d’excuses pour venir.
Avec une Keynote d’ouverture d’Emmanuel Bernard sur les communautés pour commencer, voici un aperçu du programme :
– Le futur de GlassFish par Alexis Moussine-Pouchkine d’Oracle
– GWT, le web 2.0 à portée de main par Nicolas De Loof du Breizh JUG
– eXo Social, an OpenSocial implementation Tugdual Grall d’eXo Platform
– JSF 2.0 par Damien Gouyette
– JDuchess par Claude Faguière de Valtech
– Quoi de neuf dans Hibernate : une perspective de JPA par Emmanuel Bernard de Red Hat JBoss
– Google App Engine : le cloud façon Google par Christophe Jollivet du Tours JUG
– Maven 3 au coeur de la forge logicielle par Nicolas De Loof du Breizh JUG
– Spring 3 en production par Julien Dubois de Responcia
– le MDA en 2010, une vision pragmatique ! par Jérôme Benois
– Outils d’audit et diagnostic pour les développeurs et administrateurs d’applications OSGi/Java EE par Florent Benoît
Un programme gratuit organisé par l’équipe du Poitou-Charentes JUG avec le sponsoring de SERLI
Pour vous inscrire et venir à la rencontre de la communauté Java du Sud-Ouest : http://www.jugsummercamp.org/
A vendredi pour un reportage en direct sur le Touilleur Express
L’envoi d’un email est simple avec le framework Web Play! Framework.
Vous pouvez envoyer un email directement en une ligne :
Mail.send("sender@express-board.fr","candidat@hotmail.fr","Subject","Test de message");
Cependant la façon la plus pratique est d’utiliser une partie du framework et des entités. Lorsque vous vous inscrivez comme candidat sur mon site express-board.fr, vous recevez un email afin de vous souhaiter la bienvenue. Voyons comment cela fonctionne.
Dans le répertoire appsnotifiers j’ai créé une classe Mails qui étend la classe Mailer de Play!
package notifiers;
import models.*;
import play.*;
import play.mvc.*;
import java.util.*;
public class Mails extends Mailer {
public static void welcome(User user) {
setSubject("Bienvenue sur eXpress Board");
addRecipient(user.email);
setFrom("contact@express-board.fr");
send(user);
}
}
La méthode welcome reçoit en argument une entité User et appelle la méthode send de Mailer. Celle-ci recherche alors un template HTML et un template TXT afin d’envoyer l’email. Il suffit donc de créer 2 fichiers portant exactement le même nom que la méthode dans le répertoire viewsMails.
Voici le fichier viewsMailswelcome.txt pour l’envoi en text/plain de l’email :
Bienvenue sur eXpress Board !
=============================
Votre compte a été activé.
Votre nom d'utilisateur est votre adresse email : ${user.email}
Votre mot de passe : ${user.password}
En cas de soucis techniques, n'hésitez pas à nous contacter par email : contact@express-board.fr
A bientôt !
L'équipe eXpress Board
Comme vous pouvez le constater, je peux utiliser le moteur Groovy de Play! pour récupérer et afficher l’email et le mot de passe de l’utilisateur. La syntaxe ${…} n’est que du Groovy, le meilleur langage de script pour la plate-forme Java.
Voici le fichier viewsMailswelcome.html :
<table width="650" align="center" style="font-size: 14px;" cellpadding="0" cellspacing="0">
<tr id="topshadow">
<td height="10" width="10" background="http://www.express-board.fr/public/images/email/shadow_tl.gif" bgcolor="#ffffff"></td>
<td height="10" background="http://www.express-board.fr/public/images/email/shadow_top.gif" bgcolor="#ffffff"> </td>
<td height="10" width="10" background="http://www.express-board.fr/public/images/email/shadow_tr.gif" bgcolor="#ffffff"> </td>
</tr>
<tr id="header">
<td width="10" background="http://www.express-board.fr/public/images/email/shadow_left.gif" bgcolor="#ffffff" rowspan="2"></td>
<td height="102" background="http://www.express-board.fr/public/images/email/header_bg.gif" bgcolor="#e6f1fb" align="center">
<table width="95%"><tr><td align="left"><img src="http://www.express-board.fr/public/images/email/email_logo.gif" /></td></tr></table>
</td>
<td width="10" background="http://www.express-board.fr/public/images/email/shadow_right.gif" bgcolor="#ffffff" rowspan="2"> </td>
</tr>
<tr id="content">
<td bgcolor="#f4faff" align="center">
<table width="95%" cellpadding="30">
<tr>
<td align="left">
<font face="Lucida Grande, Segoe UI, Arial, Verdana, Lucida Sans Unicode, Tahoma, Sans Serif">
<h3>Bienvenue sur l'eXpress-Board !</h3>
<p>Votre compte a été activé.</p>
<hr>
<p>Votre nom d'utilisateur est votre adresse email : ${user.email}</p>
<p>Votre mot de passe : ${user.password}</p>
<hr>
<p>Vous pouvez maintenant <a href="http://www.express-board.fr/administration/login">vous authentifier</a> et poster votre première annonce ! </p>
<p>En cas de soucis techniques, n'hésitez pas à nous contacter par email : contact@express-board.fr</p>
<br/>
<br/>
A bientôt !
<br/>
<br/>
<br/>
<br/>
L'équipe express-Board<br/><br/>
P.S. Suivez-nous sur notre compte <a href="http://twitter.com/expressboard">Twitter</a>
</font>
</td>
</tr>
</table>
</td>
</tr>
<tr id="bottomshadow">
<td height="10" width="10" background="http://www.express-board.fr/public/images/email/shadow_bl.gif" bgcolor="#ffffff"></td>
<td height="10" background="http://www.express-board.fr/public/images/email/shadow_bottom.gif" bgcolor="#ffffff"> </td>
<td height="10" width="10" background="http://www.express-board.fr/public/images/email/shadow_br.gif" bgcolor="#ffffff"> </td>
</tr>
<tr id="copyright">
<td></td>
<td align="right">
<span style="font-size: 12px; color: #888;"> © 2010 eXpress-Board.fr par Innoteria SARL</span>
</td>
<td></td>
</tr>
</table>
Lorsque vous envoyez des emails au format HTML, il faut que les URLs des images soient absolues. Sans quoi, les navigateurs ou les lecteurs de mails refusent de les charger.
Et comment envoyer cet email ?Voici un exemple de méthode. Un formulaire permet de saisir le nom, l’email et un texte de présentation. Au passage, notez comment Play! permet de gérer les arguments obligatoires d’un formulaire et de valider le champ email. Il y a différentes façons de faire, je vous proposerai un article séparé pour vous en parler.
public static void saveNewUser(@Required String fullname,
@Required String email,
@MaxSize(message = "Le contenu du champ présentation est trop long", value = 1000) String presentation) {
validation.email(email).message("Email invalide, merci de saisir un email correct pour continuer.");
if (validation.hasErrors()) {
params.flash(); // add http parameters to the flash scope
render("/Administration/createAccount.html");
return;
}
// verification si user existe deja..
...
...
// creation de l'utilisateur
User user = new User();
user.email = email;
user.fullname = fullname;
user.presentation = presentation.trim();
user.password = RandomStringUtils.randomAlphanumeric(9);
user.active = Boolean.TRUE;
user.validateAndSave();
// Envoi de l'email
Mails.welcome(user);
render(user);
}
Configuration d’un compte Gmail
Pour l’eXpress-Board, j’ai fait simple : j’utilise une boite email hébergé sur Gandi.net. J’ai ensuite configuré mon compte GMail afin de l’autoriser à aller chercher les emails via POP/IMAP sur ce serveur. Et le tour est joué… je reçois mes emails de l’express-board sur ma boite GMail.
Pour configurer un compte Gandi avec Play! afin de pouvoir envoyer un email, voici ma configuration (avec le mot de passe modifié bien entendu)
%playapps.application.mode=prod
%playapps.db=mysql:play:play@play
%playapps.mail.smtp.host=mail.gandi.net
%playapps.mail.smtp.user=contact@express-board.fr
%playapps.mail.smtp.pass=MOT DE PASSE EN CLAIR
%playapps.mail.smtp.channel=ssl
%playapps.mail.smtp.port=465
%playapps.mail.debug=false
J’utilise l’hébergement PlayApps.net, la plateforme de cloud de Zenexity. C’est l’hébergeur du site l’express-board. Cela fonctionne vraiment bien, c’est gratuit pour l’instant, et j’en suis vraiment très content.
Allez, Ã vous de jouer maintenant !
UpdateSuite aux 2 remarques de Benoit et Tartur, je précise quelques points qui peuvent surprendre lorsque l’on découvre Play! L’entité User n’a pas attributs statiques. Il n’y a pas d’encapsulation, les propriétés sont publiques tout simplement.
package models;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
import play.db.jpa.*;
import play.data.validation.*;
import java.util.List;
@Entity
public class User extends Model {
@Email
@Required
public String email;
@Required
public String password;
@Lob
@MaxSize(1000)
public String presentation;
public Boolean active;
public User() {
}
public static User connect(String email, String password) {
return find("byEmailAndPassword", email, password).first();
}
public static User findByEmail(String email) {
return find("byEmail", email).first();
}
@Override
public String toString() {
return fullname;
}
public static List findAllActives() {
return find("active", Boolean.TRUE).fetch();
}
}
La classe User étend Model, une classe de base de Play! Celle-ci me fournit quelques services. Elle étend elle-même la classe JPASupport de Play, qui donne un ensemble de méthode type crud directement à mon entité. C’est une approche différente de ce que l’on voit classiquement en Java. Bien entendu vous pouvez écrire du code JPA classique, mettre des services et des DAO, cela fonctionne aussi. Mais j’apprécie de gagner du temps en utilisant ce système de Play! qui est plutôt bien pensé.
No, GlassFish 3.1 will not be *only* about clustering, there's more to it :
The JDBC content of this short screencast is described in this planning document. Also check out Shalini's blog about what was new in GlassFish v3, it has several detailed entries.
Other 3.1 milestone demos are available on the GlassFish Youtube Channel and subscribe to see the next one as they are published..
Voici les résultats de l’enquête sur les salaires lancée il y a quelques semaines sur le Touilleur Express. Quelques points importants avant d’aller plus loin : il s’agit d’une enquête ciblée sur les lecteurs du blog, plutôt que sur les informaticiens en général. Je n’ai pas assez de chiffres et de critères discriminants pour parler d’un échantillon représentatif. Concernant les montants des salaires et primes versés en 2009, il s’agit de net imposable, pas d’un montant brut. Or lorsque vous négociez un poste, ou que vous voyez une offre d’emploi, la rémunération est indiquée en valeur brute. Attention donc à ne pas vous laisser surprendre. Enfin la fois prochaine je vous demanderai la valeur exacte, votre type de poste et votre secteur d’activité.
701 personnes ont répondu à l’enquête, 683 hommes et 18 femmes (3%). La majorité des personnes travaille en Ile-de-France (45% soit 317 personnes), suivi de la région Rhônes-Alpes (8% soit 53 personnes) puis Nord-Pas-de-Calais (8% 52p) et enfin Pays-de-la-Loire (6% / 45p). Il y a eu aussi 10 réponses de Belgique, 14 du Luxembourg et 10 de Suisse. Enfin 12 personnes en dehors de l’Europe
A 92% vous êtes salariés en CDI/CDD. Les indépendants ne sont que 5% (32 personnes) suivi des étudiants à 3%. Et il n’y a eu que 2 demandeurs d’emplois (sur 701 personnes). La majorité de vous (62% soit 438 p) n’encadre pas de personnes, on peut parler de développeur ou d’architecte. Vous êtes 24% à encadrer entre 1 et 4 personnes, 9% entre 5 et 9 et seulement 4% encadre plus de 10 personnes.

(Cliquez sur les graphiques pour les afficher dans une autre fenêtre en grand)
A la question « travaillez-vous en SSII ou en tant que freelance pour une SSII » vous êtes 49% (310 personnes) à répondre oui. Cela donne une idée de l’importance des personnes qui travaillent en sociétés de services dans la population qui lit le blog le Touilleur Express.
Cette année, seulement 34% d’entre vous ont demandé une augmentation. 56% n’ont rien demandé pour l’instant (nous sommes en août) et 10% sont sans opinion (indépendant, étudiant, non concerné…). Ceux qui ont demandé une augmentation (239 personnes) ont eu un succès partagé. Vous n’êtes que la moitié à être concerné, un quart a obtenu cette augmentation, un autre quart n’a rien n’obtenu, et la moitié ne s’exprime pas. Il semble donc que les conditions d’attribution des augmentations ne soit pas forcément impacté par la crise.
La majorité des personnes interrogées et qui sont en CDI/CDD n’a pas de part variable dans leur salaire : 54% répondent non et 46% répondent oui. En Ile-de-France c’est l’inverse. Sur l’échantillon de 317 personnes en CDD/CDI en Ile-de-France (SSII ou non), la majorité (55%/174) a une part variable dans le salaire. Le fait de travailler en SSII ou non ne change pas beaucoup ce ratio. La part variable dans la rémunération peut prendre la forme d’une prime sur objectif, d’une participation de l’entreprise ou d’une prime d’équipe.
Lorsque l’on regarde la répartition des tranches de salaire, à partir de 41 kEUR net par an, la majorité des personnes a une part variable.
Lorsque je vous demande si vous avez envie de changer d’entreprise d’ici à la fin de cette année 2010, vous répondez non à 48% (335 personnes). Cependant, 30% répondent oui, et 22% sont sans opinion ou indécis. 210 personnes (30%) répondent clairement qu’elle ont envie de changer d’entreprise d’ici à la fin de l’année. Pour moi qui me suit lancé dans l’aventure de l’eXpress-Board c’est un indicateur important. Vous êtes d’ailleurs 53% à connaître le site, 39% à ne pas le connaitre.
Le montant de votre revenu net imposable en 2009Afin d’être au plus juste, j’ai demandé aux personnes interrogées dans l’enquête de me donner le montant déclaré sur leur déclaration de revenu 2009. Voici quelques résultats sous forme de courbe. Cliquez sur chaque image pour l’afficher en grand.
Les indépendants sont ceux qui déclarent un revenu imposable le plus important (au delà de 100kEUR). Attention, il s’agit des indépendants qui sont structurés en Entreprise Individuelle et qui sont placés sous le régime des Bénéfices non commerciaux déclarés sur leur imposition personnel. Lorsque vous avez une EURL soumises à l’impot sur les sociétés comme moi, la tranche de revenu est similaire à un salarié en CDD/CDI. Lorsque vous êtes en EI/BNC c’est vous en tant que particulier qui devait supporté l’ensemble des charges et de l’impôt. Il n’est pas possible de moduler sa fiscalité aussi finement qu’avec une EURL soumise à l’IS.

Les chiffres sont intéressants. Grâce à Excel et à un tableau croisé dynamique, on découvre des faits amusants. Ainsi je peux vous dire que ceux qui connaissent l’eXpress-Board gagnent plus en moyenne que ceux qui ne connaissent pas le site…

SSII ou pas ? Finalement peu de différences lorsque l’on regarde la répartition entre les 2. La tranche 26-30kEUR net par an est celle où l’écart est le plus important. Peut-on dire que les juniors commencent en SSII ? Ou que les sociétés de service sont les premiers employeurs lorsque l’on débute ?

Voici la répartition par tranche d’expérience des personnes en CDI/CDD travaillant ou non pour une SSII. La majorité des juniors travaillent en sociétés de service :

Les personnes en CDI/CDD avec entre 1 et 5 années d’expériences se répartissent comme suit:

Si l’on regarde la région Ile-de-France par rapport aux autres régions et pays, il y a plus de personnes avec 7/8 années d’expérience en Ile-de-France qu’autre part.

Difficile de mesurer l’écart de salaire entre l’Ile-de-France et les autres régions. Regardez simplement la différence entre la courbe rouge, pour la région Ile-de-France et les autres régions ou pays. Attention la courbe représente le total de personnes ayant répondu, et comme l’échantillon n’est pas lissé, il est normal de voir un écart important

Je ferai mieux la fois prochaine. Il faut que je demande le montant brut, chiffre couramment utilisé sur les offres d’emplois. Il faudra aussi que je demande la fonction, quoique j’ai vu des Architectes encadrer des personnes, des Chefs de projets sans équipe et des développeurs indépendants qui gagnent 3 fois le salaire d’un chef de projet… donc j’y crois pas trop. Le secteur (finance, media, assurance) pourrait être intéressant. Ensuite il faudrait voir s’il serait intéressant d’ajouter les langages (Java ou pas)…
Je pense que je n’aurai pas assez de chiffres et qu’il vaut mieux rester simple. Voilà si vous avez d’autres idées de sondage, n’hésitez pas à m’en faire part dans les commentaires.
Le fichier Microsoft Excel 2007 avec la pivot table est librement disponible si vous avez envie de creuser les chiffres par vous même :
Enquête sur les salaires 2010 (vos commentaires ont été effacé)
[Updated] voici une courbe montrant le nombre de personnes dans une tranche de salaire par rapport à l’experience. Je n’ai pris que les 7 tranches les plus complètes.

If you haven't seen Eduardo's post on the new faces in the GlassFish team, check it out. It's great to have more people working on the project and specifically on the 3.1 release which is going strong with Milestone 4 recently out and Milestone 5 set to be feature-complete by JavaOne (if all goes well).
Planning is documented on the GlassFish Wiki, milestones and promoted builds are available from download.java.net/glassfish/3.1/promoted.
Tonight I gave a presentation at Android Montreal about the AsyncTasks API, for the Android platform.
Although the main content was « said » during the presentation, you can download the support :
or you can read it, Asynchronous Tasks with Android on slideshare.
If you want to compare the different ways to deal with multi threading on the android platform, you can also have a look at the project I created on Github, AsyncTasksDemo.
Also, you can have a look at the source code of G2Android, in this application I use a lot of AsyncTasks to be able to run worker threads fetching remote content over HTTP (you can particularly have a look at AddPhotosTask)
Many thanks to the Android Montreal volunteers for hosting my presentation! It’s a really nice event with bright developers !
if you’re interested in the AsyncTask API, you MUST read those blog posts from Android developers :
With recent versions of GlassFish 3.0 (and beyond), the asadmin syntax has been cleaned up a bit and you might find your old syntax not working anymore for instance for doing remote operations on a given server and port.
asadmin now has a well-defined set of "common" options such as --host, --port, --terse that are independent of the subcommand used (start-domain, deploy, etc.). The full list of such options is documented here.
For instance, here's how to redeploy hello.war to a GlassFish server running on myserver.mydomain with admin port set to 4848 while preserving sessions :
asadmin --host mymachine.myport --port 4848 redeploy --properties keepSessions=true hello.war
J’ai reçu ce matin la dernière lettre d’information concernant l’organisation de la conférence Devoxx. Celle-ci aura lieu la semaine du 15 novembre à Anvers en Belgique, comme chaque année. C’est l’une des plus grosses conférences pour la communauté Java. 2800 personnes l’an dernier, mais 3200 personnes en 2008, c’est du lourd. Voici donc quelques informations présentées dans cette lettre d’information.
Tout d’abord au rythme où vont les inscriptions, les organisateurs prédisent une augmentation de 30% de la fréquentation. De mon côté c’est fait, je suis inscrit pour toute la semaine comme l’an dernier. Cette année la conférence sera certainement différente. Je ne sais pas si vous avez lu les derniers blogs la semaine dernière, mais il y a du rififi entre Oracle et Google. Il y a quelques semaines, Oracle Corporation a décidé d’attaquer Google par rapport à 7 brevets utilisés au sein de la plateforme Android. Google a annoncé la semaine passée qu’il ne participera pas à la conférence JavaOne qui a lieu mi-septembre. Les conférences prévues par les speakers de Google ont été annulé (Josuha Bloch ou Romain Guy par exemple).
James Gosling, l’un des fondateurs du langage Java, a lancé une campagne de tee-shirt « Java: just free it » à destination d’Oracle, afin de sauver le langage de la main-mise de l’éditeur de base de données américain. Et le plus fun c’est que James Gosling est prévu pour faire une conférence de clôture à Devoxx à la fin de cette année. La lettre d’information croustille en promettant une présentation « un-censored ». Cela va certainement rattraper l’an passé, où James Gosling n’avait rien pu nous dire.
Parmi les présentateurs intéressants, on annonce la présence de Martin Odersky, le père du langage Scala, de Ben Alex le fondateur du projet Spring ROO et de Claus Isben, l’un des commiters d’Apache Camel les plus actifs.
La liste des personnes de la communauté Java n’est pas encore complète mais voici d’autres noms :
* Mark Reinhold (JavaSE 7 Keynote)
* Roberto Chinnici (JavaEE 7 Keynote)
* Martin Odersky (Scala Founder)
* Ben Alex (ROO Founder)
* Brian Goetz (Project Lambda)
* Joe D’Arcy (Project Coin)
* Graeme Rocher (Grails Founder)
* Steve Freeman (Agile-holic)
* Claus Ibsen (co-Founder Camel)
* David Geary (JSF/GWT Rock Star)
* Kito Mann (JSF Rock Star)
* Costin Leau (Spring Guru)
* Guillaume Laforge (Groovy Lead)
* Bill Venners (Scala Rock Star)
* Paul Sandoz (JAX-RS lead)
Ce sera aussi l’occasion de rencontrer l’ensemble des Java User Group, qui participent activement chaque année à Devoxx.
A bientôt et bonne rentrée.
I'm in the process of learning scales, modes and chords for the guitar, but these aren't easy to remember. Being a developer, I thought I could write a small program to help me understand how they are built, and where I can find the related notes on the guitar neck. So I spent a couple of hours on it tonight (mainly to find documentation on music... Lire Become a Guitar Hero with The Coder's Breakfast !
With the engineers cranking new milestones releases of GlassFish 3.1, the screencasts try to follow.
The latest one is discussed on TheAquarium. Here's a direct link to the video.
I was fortunate enough to visit Congo Brazzaville (just celebrating their 50 years of existence) to present at the jCertif conference, probably the biggest Java event in central Africa. I was expecting an adventure and an experience. I wasn't disappointed. So of course this is Africa and I probably shouldn't be surprised to see children cross the runway only seconds after the plane had landed. The food (fish, meat, chicken and bananas!) was great and the crowd welcoming. I had had a taste of what to expect when chatting with Max Bonbhel, the organizer of the conference, a leader of the CongoJUG (great logo btw), and overal an entrepreneur.
Max had arrived a week early (he lives in Canada) and had to find a venue, sponsors and take care of all the logistics. He did great with the event finally taking place in the National Center of Congress with the support of the ministry of New Technologies and major telcos as the sponsors. He also managed to get the two of us to appear for an interview on national TV the day I landed to promote the event (and our respective topics).
Congo Brazzaville seems to be, like other countries in this part of Africa, (finally) experiencing a shift to broadband with a fiber backbone coming up in 2011 and the younger generation starting to slowly take advantage of the new IT opportunities this will bring. Infrastructure is still a big concern with the capital city still experiencing unplanned and *planned* electricity outages (not a good idea to be in the elevator at that time). For anyone telling me that Internet access and bandwidth are no longer a problem anywhere in the world, I can now share that downloading a 50MB GlassFish archive will take a good 8 hours (download size does matter here, CDs are welcome), that SVN worked sporadically for me (if at all), and that watching streamed video is just not an option. Internet access is still very expensive and you are asked to think twice about bandwidth. This obviously makes it still a bit hard to do business on the Internet but with infrastructures improving by the day the country is waking up to the possibilities.
The conference itself was held in an impressively large room which I understand is where the parliament meets. Access to the conference wasn't free but costed only about the price of a softdrink. About 300 people participated, some coming from neighbor Congo (CDR), others flying from Togo, Kenya and other countries. Max kicked off the day with a talk about web 2.0 and the impact it will have from a social, technical and business point of view. Mike Levin (freelance consultant, Swampcast podcast, codetown.us, ...), straight from Florida and also a JUG-addict (he runs no less than 4 JUGs) then got down to some more details about the technical building blocks of web 2.0 development. It was great to meet Mike (we stayed in the same hotel) as I could help him with his French (the official language here) and he'd teach me the lingala (local dialect) words he had learned (Keetoko!). We also found out that we had a great deal of people in common. Check out his post about the conference.
The next speaker was Horacio from Togo talking about Talend. His talk was a great balance with a few slides to set the stage on ETL's and about a half an hour demo which is usually too long for people to follow along but this one progressed very nicely. I then presented on Java EE and GlassFish (slides), trying to start slow for the people that hadn't used it before but also covering Java EE 6 new features for the more advanced crowd (I got some pretty advanced questions during lunch). Finally Stanyslas from Kinshasa presented the NetBeans platform for building rich applications and in particular the RAMS (Refugee Assistance Management System) application he's building for the United Nations' HCR (refugee organization). A good didactic talk, NetBeans Platform extraordinaire Geertjan would have been proud!
The event continued for another 3 days of training and preparation for the Java Certification. This is free training and the deal is that if you attend (80 people showed up on the first day) you need to train others yourself in the next 6-9 months. This is just a moral obligation and training a couple of people over a few hours is good enough. I think this is a great initiative and a great way to build communities, something that feels pretty natural to the people I've talked to while in Congo Brazzaville.
While writing this it occurred to me that I've now traveled to all main continents (still working on Antartica) to talk about GlassFish!
Mes notes sur le deuxième livre de la société 37signals, Rework. Il fait suite à Getting Real. J’ai avalé rapidement le livre car les idées sont tranchantes, inspirantes et quelque fois révoltantes. Mais le but est là : réaliser qu’il y a d’autres façons de faire du business. de concevoir son entreprise et de travailler.
Oui, il est possible de concevoir des applications avec moins de fonctionnalités que la concurrence. Non, l’argent des investisseurs n’est pas toujours bon à prendre.
Le livre est composé d’un ensemble de courts chapitres et décrit les recettes qu’applique 37Signals pour ces produits et sa façon d’être en tant que business.
Learning form mistakes is overratedApprendre de ses erreurs est surévalué, il vaut mieux apprendre de ses succès. L’échec n’est pas un pré requis du succès. Quelqu’un qui a déjà eu un succès a plus de chance de l’être à nouveau. Ceux qui ont eu un échec n’ont pas plus de chance d’avoir un succès que les nouveau.
[Voir l'article de Leslie Berlin "Try, try again, or maybe not" qui montre que l'échec ne garantit pas le succès mais que le succès participe au succès].
Why Grow ?Une entreprise avec beaucoup d’employé n’est pas forcément saine. Avec la taille viennent de nouveaux problèmes et une plus grande complexité. Chacun doit trouver la bonne taille pour son business en commençant petit et en voyant comment il grandit.
Start making somethingUne idée ne vaut rien tant que vous n’en avez rien fait. La vraie question est de quelle bonne façon on la réalise.
No time is no excuseIl est toujours possible de prendre quelques heures dans son planning pour travailler sur nos projets. Pas de temps, n’est pas une excuse !
Outside Money is plan ZPrendre l’argent d’investisseurs peut ne pas en valoir le coût, car :
Le mot Startup signifie être dispendieux, ne pas affronter les réalités du marché, être dans une bulle. Or la réalité est là . Mieux vaut créer un business qu’une Startup.
Embrace constraintMoins (de temps, d’argent, de personne, d’expérience) est une vraie bonne chose. Cela force à être créatif et à éviter le gâchis.
Illusions of agreementEssayer de supprimer les niveaux d’abstractions (docs, plans, rapports). Chacun peut imaginer une chose différente de chaque niveau. Seul le résultat (le produit) met tout le monde d’accord.
Reasons to quitQuestions à se poser pour s’assurer que l’on travaille sur des choses qui importent :
Ne pas hésiter à abandonner ce que l’on est en train de faire. Des fois, c’est la bonne chose à faire.
Make tiny decisionsMieux vaut faire un ensemble de petites décisions qu’une grosse décision. Grosse décision égale de grosses erreurs. Cela n’est pas vrai pour de petites décisions qui seront réparables. Cela n’empêche pas d’avoir de grosses idées et de grands plans, juste que la meilleure façon de les réaliser, c’est par petite décision.
Les meilleurs buts sont ceux que l’on peut atteindre, puisqu’une fois réalisés, on peut construire dessus.
Underdo your competitionPour battre un compétiteur, pas besoin de faire plus. Viser à moins faire que ses concurrents, mais faire mieux. [Philosophie à la base des produits de 37Sgnals]
Emulate ChefsApprendre aux autres ce que l’on connait de son business, ne veut pas dire que les autres pourront nous copier plus facilement (image des chefs cuistot qui donnent leur recette).
Drug dealers get it rightPouvoir faire essayer un produit (une dose) car s’il est bon les clients reviendront pour se le payer.
Résumés are ridiculousUn CV est toujours exagéré mais aussi toujours vague. Embauchez sur la base du CV est dangereux. Une lettre de motivation est déjà mieux car il n’est pas possible que le candidat ait envoyé une lettre personnalisée à 100 entreprises.
Years of irrelevanceLes années d’expérience ne veulent pas dire grand chose. Connaitre combien de temps une personne a fait une chose ne vaut pas savoir avec quelle qualité et comment elle l’a fait.
Hire great writersLe talent pour l’écriture est un critère de choix entre candidats. Savoir bien écrire signifie savoir penser correctement, communiquer et savoir expliquer.
Take a deep breathLes gens sont des créatures ave des habitudes, c’est pour cela que le changement est souvent vu comme négatif. Une réaction négative est presque toujours plus forte et plus passionnée qu’une réaction positive.
Quand on réalise en changement, il y aura toujours de mécontents. Il faut les écouter, attendre un peu, montrer que l’on est conscient du problème. Souvent les gens s’adapteront.
Decisions are temporaryUne décision n’est pas définitive. Il faut se laisser la possibilité d’y revenir. Décider pour maintenant et s’inquiéter pour le futur plus tard.
Liens annexes
Il y a deux mois, avant de partir en vacances, j'ai été contacté par Packt Publishing pour faire la revue de leur tout nouveau livre GlassFish Security, écrit par Masoud Kalali.
Vous allez voir, le hasard fait bien les choses : ils ne pouvaient pas mieux tomber.
Bref, le temps que la Poste fasse son office, me voilà donc avec ce fameux GlassFish Security entre les mains.
Recette de poisson aux petits oignons Bon, alors, voyons voir ce livre. Concrètement, y'a quoi dedans ? Au recto, le titre "GlassFish Security" est assez laconique, mais le sous-titre est nettement plus explicite : Secure your GlassFish installation, Web applications, EJB applications, application client modules, and Web Services using Java... Lire Critique de livre : GlassFish Security
Transcription de la session de Patrick KUA à l’USI 2010 : Building the next génération of technical leaders.
DéfinitionUn leader technique est un développeur qui passe 30% de son temps à coder avec l’équipe et 70% en activités de leader. Il a donc deux types de compétences : le développement et le leadership.
Un leader technique ne doit pas être déconnecté de ce qu’il prône, sinon il risque de se baser sur ses opinions plutôt que sur des faits.
Un leader est facteur important pour la réussite d’une équipe.
De mauvais Leaders TechniquesDifférents types de mauvais leader technique :
Il existe des développeurs dont la valeur produite est négative (leur impact nette est négative). Il en est de même pour les leaders techniques. Ceux-ci peuvent provoquer une perte d’enthousiasme de l’équipe, de l’apathie ou encore de la déresponsabilisation.
Former de bons leader techniquesNos systèmes ne savent pas produire de bons tech leads. Le principe de Peter est souvent de rigueur. Ce principe stipule que dans une hiérarchie, un employé tend à s’élever jusque son niveau d’incompétence.
Patrick raconte une anecdote sur des chercheurs italiens qui ont démontré qu’une société est plus efficace si elle fait monter en grade les personnes aléatoirement plutôt qu’en se basant sur le mérite.
Un bon développeur ne fera pas forcément un bon leader technique. Les compétences de ces deux métiers ne sont tout simplement pas les mêmes.
Des compétences différentesCompétences du développeur :
Compétence du leader technique :
Pour avoir de meilleurs leaders techniques, Patrick recommande de :
(FR)
La cellule d'expertise de votre entreprise a développé un Timer pour que vous puissiez mesurer les performances de votre application, mais... ils ont juste oublié de fournir une méthode pour récupérer la valeur du compteur ! Comment faire pour l'afficher une fois la mesure prise ?
Vous ne pouvez intervenir que sur la classe Quiz41, et il est interdit de modifier le code existant ou d'utiliser la Réflexion.
Bonne chance !
(EN)
The Architects Team developed a Timer class to help you measure the performance of your code, but... they forgot to provide a method to get the timer's value ! How can you get it back and print it in the console ?
You can only alter the Quiz41 class ; modifying the already existing code or using Reflection is forbidden.
Good luck !
- public class Quiz41 {
- public static void main(String[] args) throws InterruptedException {
- Timer timer = new Timer();
- timer.start();
- Thread.sleep(new Random().nextInt(2000));
- timer.stop();
- }
- }
- public class Timer {
- private TimerThread thread = new TimerThread();
- public void start() {
- thread.start();
- }
- public void stop() {
- thread.stop();
- }
- public static class TimerThread extends Thread {
- private AtomicInteger counter = new AtomicInteger(0);
- @Override
- public void run() {
- try {
- while (!isInterrupted()) {
- counter.incrementAndGet();
- Thread.sleep(100);
- }
- } catch (InterruptedException e) {
- interrupt();
- }
- }
- public int getCounter() {
- return counter.get();
- }
- }
- }
Réponse / Answer : Soon !... Lire Java Quiz #41 : time attack !
Profitons de l’été pour préparer la rentrée. Vous avez à peine terminé de remplir votre déclaration de revenu de l’année 2009 ? Cela tombe bien, nous allons vous demander quel a été votre salaire ou vos revenus l’an passé et cette année.
Les lecteurs du Touilleur Express sont des passionnés. Est-ce que les passionnés gagnent plus que les autres ? Aucunes idées, mais nous allons avoir une première idée grâce à ce sondage. La rentrée s’annonce chargée, le marché repart plutôt fort après un début d’année plus calme qu’en 2009.
J’ai aussi pris en compte les indépendants et les freelances dans ce sondage, afin de mesurer le nombre d’indépendant par rapport au nombre de salarié. J’ai aussi pris en compte la différence entre salarié en SSII et salarié d’une entreprise, d’un éditeur ou d’un client final.
N’hésitez pas à faire passer l’adresse de cette page via Twitter, à vos amis informaticiens ou travaillant dans le monde informatique.
Vous pouvez me faire part de vos remarques par email ou via Twitter.
Chargement en cours…
Just in case you haven't seen this on TheAquarium, we *are* going to have both a community event (similar to previous years unconferences) and a party at this year's JavaOne. Here are the relevant entries:
• GlassFish Community Meeting During JavaOne
• GlassFish Party at JavaOne
Both events require registration and some sort of conference pass.
Sign up here: [wikis.sun.com]
See you there!
(FR) Voici les résultats du sondage lancé il y a deux semaines. La question était : ce blog doit-il continuer à être écrit en Français, passer en Anglais, ou contenir un mélange des deux. Comme vous le voyez, les résultats sont serrés, la décision sera donc difficile à prendre. Certes, mon audience historique est française, mais ma récente... Lire French / English poll result
I just love these incredible fake vintage drawings of our "modern" technologies (see below). What is modern, what is not ?
And how old is too old in computer science ?
We've been using computers on a large scale for less than 30 years, and Internet for less than 15 years. Compare this to 1 century of industrial age, 6 of text printing, and 53 of writing...
... Lire Modern technologies ?
Voici un article qui intéressera plus les débutants, et qui intéressera aussi ce qui cherchent un petit exemple afin de tester JPA 2, l’implémentation d’Hibernate 3.5 et Apache Derby. Je vous parlerai aussi de la librairie Google Guava, qui permet de simplifier le code de son entité. Bref un petit article sans prétentions, à lire sur la plage.
Voyons comment créer un petit projet simple avec JPA. J’utilise Apache Derby, une base en mémoire qui permet de tester du code simple sans avoir besoin d’une vraie base Oracle ou MySQL. Du côté des dépendances, je vous déconseille slf4j-simple. Prenez plutôt slf4j-log4j12 afin de pouvoir contrôler la verbosité des logs d’Hibernate. J’utilise Apache Derby 10.5.3.0, et j’ai ajouté le repository de JBoss.
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.letouilleur.sample</groupId>
<artifactId>sample</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Articles du Touilleur Express</name>
<url>http://touilleur-express.fr/</url>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>jboss</id>
<name>JBoss repository</name>
<url>http://repository.jboss.org/maven2</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>r06</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.3.2.GA</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.5.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.1-Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
</dependencies>
</project>
Persistence
Dans le répertoire testresourcesMETA-INF j’ai placé un fichier persistence.xml. Je déclare explicitement mon entité org.letouilleur.sample.Instrument
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>org.letouilleur.sample.Instrument</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.url" value="jdbc:derby:memory:unit-testing-jpa"/>
<property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.connection.username" value=""/>
<property name="hibernate.connection.password" value=""/>
</properties>
</persistence-unit>
</persistence>
Test avec JPA
Pour tester l’entité, j’ai fait le choix d’écrire le minimum de code et de ne pas utiliser Spring. J’ai créé une classe abstract pour tout ce qui est mise en marche du contexte de persistence, puis un test simple pour valider la création de mon entité. Pas de DAO non plus, l’EntityManager est un DAO à part entière non ?
Le test de base:
package org.letouilleur.sample;
import junit.framework.TestCase;
import org.apache.derby.impl.io.VFMemoryStorageFactory;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.io.File;
import java.sql.DriverManager;
import java.sql.SQLNonTransientConnectionException;
import java.util.logging.Logger;
/**
* A simple Persistence Unit test.
*
* @author Nicolas Martignole
* @since 5 août 2010 21:53:10
*/
public abstract class PersistenceTest extends TestCase {
private static Logger logger = Logger.getLogger(PersistenceTest.class.getName());
private EntityManagerFactory emFactory;
protected EntityManager em;
public PersistenceTest(){
}
public PersistenceTest(String testName) {
super(testName);
}
@Override
protected void setUp() throws Exception {
super.setUp();
try {
logger.info("Starting in-memory database for unit tests");
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
DriverManager.getConnection("jdbc:derby:memory:unit-testing-jpa;create=true").close();
} catch (Exception ex) {
ex.printStackTrace();
fail("Exception during database startup.");
}
try {
logger.info("Building JPA EntityManager for unit tests");
emFactory = Persistence.createEntityManagerFactory("testPU");
em = emFactory.createEntityManager();
} catch (Exception ex) {
ex.printStackTrace();
fail("Exception during JPA EntityManager instanciation.");
}
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
logger.info("Shuting down Hibernate JPA layer.");
if (em != null) {
em.close();
}
if (emFactory != null) {
emFactory.close();
}
logger.info("Stopping in-memory database.");
try {
DriverManager.getConnection("jdbc:derby:memory:unit-testing-jpa;shutdown=true").close();
} catch (SQLNonTransientConnectionException ex) {
if (ex.getErrorCode() != 45000) {
throw ex;
}
// Shutdown success
}
VFMemoryStorageFactory.purgeDatabase(new File("unit-testing-jpa").getCanonicalPath());
}
}
Le test InstrumentJPATest me permet de tester la création de mon entité :
package org.letouilleur.sample;
/**
* A simple JPA integration test to demonstrate equals and hashCode issues.
*
* @author Nicolas Martignole
* @since 5 août 2010 22:24:29
*/
public class InstrumentJPATest extends PersistenceTest {
public void testPersistence() {
try {
em.getTransaction().begin();
Instrument instrument = new Instrument("FR1234567890");
em.persist(instrument);
assertTrue(em.contains(instrument));
em.remove(instrument);
assertFalse(em.contains(instrument));
em.getTransaction().commit();
} catch (Exception ex) {
em.getTransaction().rollback();
ex.printStackTrace();
fail("Exception during testPersistence");
}
}
}
Entité
Nous sommes maintenant prêt à créer notre Entité. Je vous propose 2 versions : une simple et une différente avec Google Guava.
Dans la spécification JSR-317 de JPA2, notez les points suivants :
Extrait de la spécification JSR-317:
The entity class must be annotated with the Entity annotation or denoted in the XML descriptor as an entity.
The entity class must have a no-arg constructor. The entity class may have other constructors as well. The no-arg constructor must be public or protected.
The entity class must be a top-level class. An enum or interface must not be designated as an entity.
The entity class must not be final. No methods or persistent instance variables of the entity class may be final.
If an entity instance is to be passed by value as a detached object (e.g., through a remote interface), the entity class must implement the Serializable interface.
Entities support inheritance, polymorphic associations, and polymorphic queries.
Both abstract and concrete classes can be entities. Entities may extend non-entity classes as well as entity classes, and non-entity classes may extend entity classes.
The persistent state of an entity is represented by instance variables, which may correspond to Java- Beans properties. An instance variable must be directly accessed only from within the methods of the entity by the entity instance itself. Instance variables must not be accessed by clients of the entity. The state of the entity is available to clients only through the entity’s methods—i.e., accessor methods (get- ter/setter methods) or other business methods.
En résumé:
- votre Entité peut soit utiliser une annotation, soit être configurée via XML
- elle doit avoir un constructeur public ou protected sans argument
- la classe doit être une « top-level class », il n’est pas possible d’utiliser un enum ou une interface.
- la classe ne doit pas être finale
- nécessité d’implémenter l’interface Serializable si l’object doit être détaché
package org.letouilleur.sample;
import javax.persistence.*;
import java.io.Serializable;
/**
* Instrument is a simple JPA for http://touilleur-express.fr
*
* @author Nicolas Martignole
* @since 5 août 2010 21:47:50
*/
@Entity
public class Instrument implements Serializable {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false,length = 12)
private String isin;
@Column(nullable = true,length = 150)
private String description;
// Required for JPA2
protected Instrument() {
}
public Instrument(final String isin) {
this(isin,null);
}
public Instrument(final String isin, final String description) {
if (isin == null) {
throw new NullPointerException("ISIN cannot be null");
}
this.isin = isin;
this.description = description;
}
public Long getId() {
return id;
}
public String getIsin() {
return isin;
}
public String getDescription() {
return description;
}
}
Notez l’absence de setter. Il n’est pas nécessaire d’en déclarer car j’utilise (et je préfère) la déclaration des annotations sur les propriétés plutôt que sur les méthodes. Cela permet de regrouper au début de mon fichier l’ensemble des annotations, et de ne pas devoir chercher d’éventuelles contraintes
Ajoutons les méthodes toString, equals et hashCode. Etant donné que l’ISIN est une clé métier, je vais m’en servir pour gérer l’identité de mon Entité. Je modifie aussi le constructeur afin d’utiliser la classe Preconditions de Google Guava. Cela me permet d’alléger le test sur l’ISIN. Pensez-y lorsque vous avez une méthode avec 5 ou 6 arguments obligatoires. Guava est pratique et permet d’économiser du code.
Pour la partie equals et hashCode, je m’appuie sur l’ISIN qui est une clé métier. Cela m’arrange bien, pas besoin de gérer l’id qui peut être null tant que l’entité n’est pas persisté.
package org.letouilleur.sample;
import com.google.common.base.Objects;
import static com.google.common.base.Preconditions.*;
import javax.persistence.*;
import java.io.Serializable;
/**
* Instrument is a simple JPA for http://touilleur-express.fr
*
* @author Nicolas Martignole
* @since 5 août 2010 21:47:50
*/
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"ID", "ISIN"}))
public class Instrument implements Serializable {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false, length = 12, name = "ISIN")
private String isin;
@Column(nullable = true, length = 150)
private String description;
// Required for JPA2
protected Instrument() {
}
public Instrument(final String isin) {
this(isin, null);
}
public Instrument(final String isin, String description) {
checkNotNull(isin, "Isin cannot be null"); // Google Guava
this.isin = isin;
this.description = description;
}
public Long getId() {
return id;
}
public String getIsin() {
return isin;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
// Google Guava
return Objects.toStringHelper(this).add("id", getId()).add("isin", getIsin()).add("description", getDescription()).toString();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Instrument that = (Instrument) o;
return Objects.equal(that.isin, isin); // Google Guava
}
@Override
public int hashCode() {
return Objects.hashCode(isin); // Google Guava
}
}
Soyons fou
Prenons une autre approche un peu différente. Si je vous montre d’abord le code du test unitaire, réfléchissez sur l’implémentation de la classe InstrumentV2 afin qu’elle passe le test unitaire. Vous verrez, c’est un exercice intéressant.
package org.letouilleur.sample;
import junit.framework.TestCase;
import java.util.List;
public class InstrumentV2UnitTest extends TestCase {
public void testShouldCreateAndFindAnEntity() {
InstrumentV2 instrument = new InstrumentV2("FR123456");
InstrumentV2 instrument2 = new InstrumentV2("US94394949");
InstrumentV2.persist(instrument);
InstrumentV2.persist(instrument2);
List<InstrumentV2> results=InstrumentV2.findAll() ;
assertEquals(2,results.size());
assertEquals(instrument, InstrumentV2.find("FR123456"));
}
}
A la lecture du code, nous voyons donc des méthodes statiques déclarées sur l’entité. A votre avis qu’est-ce que cela donne ? Et bien c’est faisable. Il y a plusieurs approches différentes, mais j’ai fait cela à ma manière, avec un bloc static pour créer le contexte de persistence. Je pense que l’annotation @PersistenceContexte ne servira à rien, mais je la laisse là .
package org.letouilleur.sample;
import com.google.common.base.Objects;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.DriverManager;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Instrument is a simple JPA for http://touilleur-express.fr
*
* @author Nicolas Martignole
* @since 5 août 2010 21:47:50
*/
@Entity
@NamedQuery(name = "byIsin", query = "FROM InstrumentV2 I WHERE I.isin=:pisin")
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"ID", "ISIN"}))
public class InstrumentV2 implements Serializable {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false, length = 12, name = "ISIN")
private String isin;
@Column(nullable = true, length = 150)
private String description;
@PersistenceContext
static EntityManager em;
static {
System.out.println("--- Initializing context ---");
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
DriverManager.getConnection("jdbc:derby:memory:unit-testing-jpa;create=true").close();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("testPU");
em = emFactory.createEntityManager();
} catch (Exception ex) {
ex.printStackTrace();
}
}
// Required for JPA2
protected InstrumentV2() {
}
public InstrumentV2(final String isin) {
this(isin, null);
}
public InstrumentV2(final String isin, String description) {
checkNotNull(isin, "Isin cannot be null");
this.isin = isin;
this.description = description;
}
public Long getId() {
return id;
}
public String getIsin() {
return isin;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return Objects.toStringHelper(this).add("id", getId()).add("isin", getIsin()).add("description", getDescription()).toString();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
InstrumentV2 that = (InstrumentV2) o;
return Objects.equal(that.isin, isin);
}
@Override
public int hashCode() {
return Objects.hashCode(isin);
}
public static InstrumentV2 find(String isin) {
Query q = em.createNamedQuery("byIsin").setParameter("pisin", isin);
return (InstrumentV2) q.getSingleResult();
}
public static void persist(InstrumentV2 instrument) {
checkNotNull(instrument);
em.getTransaction().begin();
em.persist(instrument);
em.getTransaction().commit();
}
@SuppressWarnings("unchecked")
public static List<InstrumentV2> findAll(){
return em.createQuery("from InstrumentV2").getResultList();
}
}
Si vous voulez tester, n’oubliez pas d’ajouter la class InstrumentV2 dans la déclaration de persistence du fichier persistence.xml. Et vous verrez, cela marche très bien !
C’est une approche similaire, quoiqu’un peu plus compliquée, qu’utilise Play! Framework. Attention, Play utilise un système d’enrichissement du code à la compilation qui permet de donner une implémentation des méthodes type find, save, delete, mais certainement pas quelque chose avec un bout de code static comme je l’a fait ici.
Je rigole car vous vous êtes dit : « tiens il ne parle pas de Play!« . Et alors que Madame vous tartine le dos pendant que vous lisez ce billet sur votre iPad sur la plage, PAF au moment où vous ne vous y attendez pas, je vous reparle de Play… Avouez que je vous ai bien eu non ?
Allez, je vais vous laisser tranquille, passez de bonnes vacances.
(FR) Afin de mieux cerner les attentes de mes lecteurs, je lance un sondage : ce blog devrait-il être écrit en Français, Anglais, ou un mix des deux - et dans ce cas, quelle langue pour quelle catégorie ? Vous pouvez voter dans la barre latérale (à droite), et laisser des commentaires sur ce billet. Merci ! (EN) To better understand what my... Lire The Coder's Breakfast : quel langage / what language ?
The GlassFish admin console is often cited as one of the strong point for GlassFish. Yes, open source and ease-of-us can live happily together! After delivering clustering and centralized admin features in Milestones 1 (post) and 2 (post) of the ongoing 3.1 work, it was time in Milestone 3 to deliver the first drop of a graphical user interface that is able to interact with these features.
The following is a short screencast (hosted on the relocated "GlassFish Channel" property) walking you through the basic scenario of creating a cluster, populating it with instances, starting the cluster, deploying an application to various targets (cluster or standalone instances) and closing with a short part on monitoring the system - all from the Graphical User Interface :
The GlassFish Open Source Edition 3.1 Promoted Builds are available from [download.java.net] and numerous details are offered on the GlassFish Wiki for this milestone and the upcoming work.
Check out [youtube.com] for more videos soon.
Servlet 3.0 has some very nice ease-of-development features in the form of new annotations (such as @WebServlet) and some useful extensibility features with web-fragments (details here) and ServletContainerInitializer which all contribute to make web.xml optional. While this is a great step towards more modular applications and an overall development simplification, you may want to have more control over what's being deployed in your production system. This is what metadata-complete helps you achieve.
web.xml contains a metadata-complete attribute in the web-app element whose binary value defines whether other sources of metadata should be considered when deploying this web application, this includes annotations on class files (@WebServlet, but also @WebListener, @WebFilter, ...), web-fragment.xml as well as classes located in WEB-INF/classes. If set to true all of these will be ignored and web.xml is the only metadata considered. Setting it to false falls back to the default behavior. Note you can also use this attribute inside fragments to have them consider annotation or not. Check the Servlet 3.0 specification (section 15.5) for details on that part.
Better than a long blog entry, here's a short screencast (available in HD) illustrating the basics of this feature :
You can try this all today in GlassFish.
Here are other Java EE 6-related "lesser-known features" :
• Module initialization order in Java EE 6
• WEB-INF/lib/{*.jar}/META-INF/resources
• Just say no to Scarlett Johansson ... (but say yes to Bean Validation)!
• javax.annotation.ManagedBean
• EJB 3.1 asynchrony and transactions
To please your Project Manager, a former developer (yeaaars ago), you sometimes let him help you develop some "very important" parts of your application.
Today, he's in charge of displaying "Hello World" by iterating on a list containing those words. Alas, distracted by his going on vacation this very afternoon, he forgets to add "World" to the list before starting the iteration. Trying to correct his mistake, he adds it a few lines later, but now his code unexpectedly breaks down at runtime ("this must be a JVM bug !").
A few minutes before leaving, he asks you to find a solution in his absence, with the following instructions :
FIXME tag shows where you're allowed to insert your corrective codeusing Reflection is not an option).
Are you worth the trust of your beloved Manager ?
- final List<String> list = new ArrayList<String>() {{ add("Hello"); }};
- final Iterator<String> iterator = list.iterator();
- System.out.println(iterator.next());
- list.add("World");
- // FIXME : work here while I'm sunbathing
- System.out.println(iterator.next());
Hints - Keep in mind that :
Note : I must thank Romain Revol for helping me to write this quiz. Romain successfully attended the "Heinz Kabutz's Java Specialist Master Course" training session I presented in France in June at Zenika's office.
Answer : Well, this is unusual. Since Steen gave the most detailed (and correct) answer I've ever seen on this blog (see comment 45 below), I will simply paste it here as the official answer. Congratulations, Steen :) When running: java -cp . ManagersHello We get : Hello Exception in thread "main"... Lire Java Quiz #40
La vie d’un développeur ce n’est pas toujours de travailler à la création d’une nouvelle application. Au contraire nous serons souvent amené à faire ce que j’appelle de l’Archéologie. Cela veut dire entrer dans du code écrit il y a quelques années, être capable de faire fonctionner une vieille application, et surtout, être capable de la moderniser sans l’abimer. J’ai regroupé quelques outils et quelques pratiques apprises ces dernières années, mais n’hésitez pas à compléter.
Règle 1 : respectez les pièces rares
Règle 2 : protéger avec une bâche
Règle 3 : prenez des radiographies du patient
Règle 4 : commencez par ce qui n’est pas cher
Règle 5 : utilisez des scanners pour détecter les peintures cachées
Règle 6 : mettez en place un suivi
Règle 7 : pensez au futur
Règle 1 : respectez les pièces rares
Dans chaque logiciel, dans chaque application que j’ai vu, il y a un petit coeur qui bat. Il y a souvent quelques classes particulièrement compliquées, dont l’historique sur Subversion est très chargé. Mon premier conseil : respectez le travail de vos anciens. Imaginez qu’à l’époque où ce code a été construit, ils n’avaient pas les outils, les blogs et l’information dont vous disposez. Soyez donc humble et ne critiquez pas à tort et à travers la qualité du code ou son architecture de l’époque. Avec un peu de chance, un EJB 2.1 Statefull codé en Facade avec des EJB 2.1 Stateless derrière prendra de la valeur avec les années… ou pas.
Plus sérieusement, il y a des parties de code qu’il convient de respecter. L’historique des bugs corrigés raconte une histoire, l’évolution du logiciel et les problèmes rencontrés par l’équipe. Je conseille de passer du temps avec les développeurs encore présent, et de bien faire attention à ne pas effacer ces fichiers, qui racontent une histoire.
Un bug corrigé c’est un bug corrigé…. Sur des problèmes compliqués comme le pricing d’une Option, croyez moi vous ne faîtes pas le fier.
Règle 2 : protégez avec une bâche
Lorsque vous vous lancerez dans du refactoring, il est important d’isoler votre travail du reste du projet. Identifiez clairement les dépendances et les limites de votre travail, et dîtes-vous : je m’arrêterai là . Utilisez par exemple mvn dependency:analyze et mvn dependency:tree pour regarder le couplage de vos modules, si vous utilisez Maven. Il est très important de définir le périmètre des classes ou des packages sur lesquel vous allez intervenir, et de vous y tenir. Sans quoi vous vous retrouvez à réécrire le gestionnaire de clic de la souris alors que vous aviez commencé à modifier une JTable…
Règle 3 : prenez des radiographies du patient
Peut-être la règle la plus importante : blindez le code existant avec des tests unitaires via JUnit, des mocks avec Mockito. Sachez qu’il est possible de mocker des classes concrètes avec EasyMock Class Extension 2.2 depuis fin 2007. Je préfère Mockito qui est plus léger et qui force à coder ses tests à la sauce Given/When/Then.
Les tests pour moi sont la radiographie du patient. C’est la garantie que votre amélioration ne casse pas le logiciel. Faites des tests d’intégration avec Fit par exemple, ou FitNess. Bref c’est de la non-régression, le B.A Ba du bon développeur.
Enfin si vous faîtes du tuning, prenez des mesures avant de commencer à modifier une ligne de code. Combien de temps pour traiter en moyenne un fichier de 50 000 lignes ? Combien de temps pour charger la 3ème page de la liste des produits ? Pensez à prendre scrupuleusement des notes et des chiffres avant de toucher quoique ce soit. Cela s’applique aussi au temps nécessaire pour compiler votre projet par exemple. Bref pensez chiffres.
Règle 4 : commencez par ce qui n’est pas cher
Ce qui est cher est risqué. Ce qui a plus de valeur par contre, c’est quelque chose de très compliqué que l’on peut corriger très rapidement. Première idée que j’ai en tête : passez à Java 6. Cela ne coûte rien, ou très peu. N’attendez pas que quelqu’un vous « autorise » à le faire. Le pilote de l’avion c’est vous. Le chirurgien c’est vous. Faîtes-le, allez voir le client ou les gens du métier, montrez-leur que le logiciel tourne mieux, et laissez-le ensuite s’occuper du psycho-rigide qui ne veut pas passer à Java 6 alors que vous êtes en Java 1.4. Vous pouvez lui faire peur en expliquant que Java J2SE 5 n’est plus supporté par SUN Microsytems depuis le 3 novembre 2009 afin qu’il se bouge un peu.
Ce qui ne coûte pas cher mais qui est un peu plus risqué, c’est les mises à jour des librairies. Vérifiez que vous êtes à jour quant aux différentes versions de vos Jars. Ce matin, nous avons trouvé un bug dans Hibernate 3.2.6 avec IBM WebSphere, et le lookup du Transaction Manager. En passant à une version plus récente d’Hibernate, le problème est résolu.
Ce qui demande un peu d’effort, c’est la partie Build. Si vous êtes avec Apache Ant et que vous en êtes content, restez avec celui-ci. Ne migrez pas à Maven ou Gradle pour être dans l’air du temps ou pour faire plaisir à un consultant. Si par contre votre build est un tas fumant et qu’il faut 23 minutes pour compiler le projet avec Maven 1, que personne ne sait vraiment comment cela marche… jetez tout. C’est ce que nous avons fait fin 2008 sur un projet avec 15 développeurs. Le build total est passé à 9mn, imaginez le temps gagné par développeur chaque jour.
Maven 2.2.x tourne vraiment bien, et il est rapide. Testez-le aussi, mais attention aux coûts cachés plus tard : il faut s’adapter à Maven afin d’en tirer le meilleur parti, plutôt que de le tordre et d’essayer de le faire marcher selon les noms de ses répertoires, et de son organisation.
Règle 5 : utilisez des scanners pour détecter les peintures cachées
J’ai l’image de ces 2 scientifiques, qui radiographient la Joconde et qui trouvent des traits de dessin de Leonard de Vinci. Imaginez leur surprise et leur joie…
Bon pour nous c’est un peu moins fun, mais attendez de voir où je veux vous emmener. Je vous conseille de tester des outils de profiling et de monitoring, afin d’identifier les points noirs de votre application. Que ce soit en terme de mémoire, comme en terme de CPU, mon préféré est yourKit que j’ai découvert chez Reuters avec Jean-Paul Schemali (spéciale dédicace) et aussi JProfiler, que j’ai beaucoup utilisé. Ces outils sont payants, mais croyez-moi, ils valent la dépense grâce à ce que vous allez économiser.
Sinon les outils de la JVM HotSpot de SUN Microsystems permettent aussi de regarder ce qu’il se passe à l’intérieur de l’application, et de corriger le tout.
Dans la série des autres scanners que j’utilise, je conseille FindBugs pour auditer le code source, et voir les bugs éventuels de l’application. Si vous voulez aller plus loin, vous pouvez installer et utiliser Sonar, j’en parle au point 6.
Un outil comme PMD est aussi gratuit et open-source. Il permet d’auditer l’ensemble du code, de signaler le code mort qui n’est jamais appelé, de vous informer des duplications et d’éventuels bugs.
Enfin je conseille aussi de nettoyer les classes : effacez le code en commentaire. De ma propre expérience, 9 fois sur 10 lorsque je décommente du code dans une classe, il ne compile plus. Le reste de la classe a changé, ou il ne sert à rien. Soyez sans pitié : effacez le code et utilisez le gestionnaire de version pour sauver vos anciennes versions. Rien ne se perd de cette façon.
Pensez aussi à nettoyer les dépendances Maven ou Ant, et à vous assurer que vous avez réellement besoin de toutes ces librairies. Avec Java 6 les choses ont changé, prenez le temps de nettoyer le code puis d’effacer les anciennes librairies.
Règle 6 : mettez en place un suivi
Une fois votre application modernisée, ou plutôt avant même d’y avoir touché, mettez en place des outils de suivi de la qualité du code, de la couverture des tests, de la performance en mémoire et CPU… Bref installez une Tour de contrôle avant de faire de l’archéologie.
Sans hésiter, installez Sonar afin de mettre votre dette technique sous contrôle. Il demande un peu d’efforts pour être correctement réglé, mais ce que j’aime beaucoup c’est le suivi. Il vous donnera un indicateur de progrès. Et il sera là aussi pour signaler aux développeurs qu’il surveille la qualité de votre produit.
Donc mettre en place un suivi du patient, afin de s’assurer qu’il ne revienne pas sur la table d’opération toutes les 3 semaines.
Règle 7 : pensez au futur
J’ai en tête la célèbre phrase du wiki C2 sur la page Code for the Maintainer :
« Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live. »
Ce qui donne
« Code toujours comme si tu savais que la personne qui maintiendra ton code est un psychopathe violent qui sait où tu habites… »
En fait il faut être eco-responsable. Vous faîtes du tri sélectif ? Et bien codez proprement. Pensez que ce sera peut-être vous dans 6 ans qui serez appelé pour corriger un problème sur votre logiciel. Ou peut-être votre fils qui aura trouvé votre nom sur Google dans un projet open-source Lambda dans 15 ans… Bref codez pour être fier de montrer votre programme à votre fils dans quelques années.
Conclusion
Je me demande si les projets et les applications passent la barre des 10 ans dans le monde Java. Je ne parle pas d’autres langages, je parle que de Java. Avec les projets ou les produits sur lesquels j’ai travaillé, j’ai déjà la réponse. Je sais ce qu’ils sont devenus. J’ai eu par contre à reprendre du code de nombreuses fois, et à faire ce travail de mise à jour, sans tout casser. Il y a donc une compétence « Docteur Love, maître du Lifting » à acquérir pour faire un bon développeur dans le monde Java.
So I'm back from FISL and I have to say I wasn't disappointed.
For people that have attended both FISL and OSCON these two conferences seem to have a lot in common. FISL had somewhere between 4000 and 5000 attendees interested in many different OSS topics which means it's quite different from your typical Java conference (lots of python, multimedia, security, linux desktops, etc.).
Coming in I spotted a competition to win an iPad and thought to myself "good, I might get away with using a Mac on stage" but this has to be one of the conferences with the least number of Apple machines, netbooks being *very* popular.
I had two talks, one called "GlassFish OSGi - from modular runtime to hybrid applications" and another titled "The future of the GlassFish community" (check the links for the slide decks). The format for the conference is a hard-stop after 40-minutes to leave time for 10-minutes of Q&A which made it a bit challenging to deliver all the content I had prepared but I certainly got a number of good questions (Brazilians are not shy ;).
It was great to meet again with Fabiane and Bruno and chat about the Sun past and the Oracle future. They are doing a lot for the Java community in Brazil (check out "Javali" coming out soon) as well as their new baby, ToolsCloud.com. So other than the nice people, the tasty meat, learning about chimarrãos, I also found out that a Frenchmen's Belgian (or Swiss) jokes are a Brazilian's jokes on Portuguese.
Soyons décontracté pendant l’exercice qui va suivre. Dire du bien ou dire du mal, c’est facile. On peut passer des heures sur des blogs à s’envoyer des commentaires à la figure, ou sinon on peut prendre son temps pour regarder les choses. Moi vous voyez, je suis un gars avec un esprit ouvert. Il y a 3 ou 4 ans je me serai coupé un bras pour vous faire apprendre JSF à la place de Struts. Je me suis ensuite coupé un deuxième bras pour vous parler de Seam et de la gestion de la conversation, par rapport aux soucis des premiers frameworks Webs. Je vous ai bassiné les oreilles avec Grails l’hiver dernier, et en ce moment je ne vous parle que de Play! Framework. Donc dans la logique des choses, je devrai tomber amoureux d’un nouveau framework PouetPouet d’ici quelques semaines. En attendant, et là je me sens à l’aise dans mes baskets, je peux vous parler de ce que j’observe. Quand je dis « JE » cela veut dire que j’ai eu le temps et l’occasion de tester ce que je vois sur de vrais projets.
Il n’y a pas de mauvais frameworks Webs. Selon votre projet je vous encourage à tester différentes approches et à évoluer selon vos besoins fonctionnels. Essayez aussi de prototyper avec un outil comme Balsamiq ou iRise Studio par exemple.
Pensez incrément lorsque vous faîtes du Web. Essayez de construire par petites étapes votre solution, et faites valider par l’utilisateur final les écrans. Le plus important : un logiciel qui marche et une interface qui répond à la demande du client. C’est cela qui doit vous guider pendant votre développement.
And now… JSF 2 and Play! FrameworkSi vous souhaitez suivre le code de cet article, je vous encourage à suivre le petit tutorial que j’ai écris sur NetBeans 6.9. Cela vous permettra de générer rapidement une petite application en JSF 2 et Java EE 6 pour la partie Bean. Vous pouvez télécharger le code complet de la partie JSF ici afin de pouvoir suivre simplement la discusssion.
Pour écrire cet article, j’ai écris la partie Play! Framework après la partie JSF 2.0. Je vous guiderai donc sur la partie Play! Framework.
Création d’une application avec Play! Framework
- Télechargez Play! Framework sur le site de Play!
- Décompressez l’archive, ajoutez ensuite le répertoire de play à votre PATH.
- Ouvrez un terminal, dans un répertoire de test, tapez « play » afin de vérifier qu’il est bien installé. J’ai utilisé la version 1.0.3
macbook-pro-de-nicolas-martignole:NetBeansProjects nicolas$ play
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ | |/ _' | || |_|
~ | __/|_|____|__ (_)
~ |_| |__/
~
~ play! 1.0.3, http://www.playframework.org
~ framework ID is macbookpro
~
~ Usage: play cmd [app_path] [--options]
~
~ with, new Create a new application
~ run Run the application in the current shell
~ help Show play help
~
- Tapez ensuite « play new micromarket » afin de créer une application de test
macbook-pro-de-nicolas-martignole:NetBeansProjects nicolas$ play new micromarket
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ | |/ _' | || |_|
~ | __/|_|____|__ (_)
~ |_| |__/
~
~ play! 1.0.3, http://www.playframework.org
~ framework ID is macbookpro
~
~ The new application will be created in /Users/nicolas/NetBeansProjects/micromarket
~ What is the application name? micromarket
~
~ OK, the application is created.
~ Start it with : play run micromarket
~ Have fun!
~
macbook-pro-de-nicolas-martignole:NetBeansProjects nicolas$
- Placez vous dans le répertoire micromarket puis tapez play run et vérifiez que la page de démarrage de Play! se lance sur [localhost:9000]
Bravo, vous avez créé une application Play.
Entité JPA
Vous pouvez prendre l’entité JPA MicroMarket du projet NetBeans et la placer dans le répertoire de Play!, cela fonctionne. En effet, il utilise JPA et Hibernate, donc pour lui, cela ne change pas grand chose. Voici le code initial de l’entité MicroMarket avant modification :
package org.letouilleur.demo;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
/**
*
* @author nicolas
*/
@Entity
@Table(name = "MICRO_MARKET")
@NamedQueries({
@NamedQuery(name = "MicroMarket.findAll", query = "SELECT m FROM MicroMarket m"),
@NamedQuery(name = "MicroMarket.findByZipCode", query = "SELECT m FROM MicroMarket m WHERE m.zipCode = :zipCode"),
@NamedQuery(name = "MicroMarket.findByRadius", query = "SELECT m FROM MicroMarket m WHERE m.radius = :radius"),
@NamedQuery(name = "MicroMarket.findByAreaLength", query = "SELECT m FROM MicroMarket m WHERE m.areaLength = :areaLength"),
@NamedQuery(name = "MicroMarket.findByAreaWidth", query = "SELECT m FROM MicroMarket m WHERE m.areaWidth = :areaWidth")})
public class MicroMarket implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "ZIP_CODE")
private String zipCode;
@Column(name = "RADIUS")
private Double radius;
@Column(name = "AREA_LENGTH")
private Double areaLength;
@Column(name = "AREA_WIDTH")
private Double areaWidth;
public MicroMarket() {
}
public MicroMarket(String zipCode) {
this.zipCode = zipCode;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public Double getRadius() {
return radius;
}
public void setRadius(Double radius) {
this.radius = radius;
}
public Double getAreaLength() {
return areaLength;
}
public void setAreaLength(Double areaLength) {
this.areaLength = areaLength;
}
public Double getAreaWidth() {
return areaWidth;
}
public void setAreaWidth(Double areaWidth) {
this.areaWidth = areaWidth;
}
@Override
public int hashCode() {
int hash = 0;
hash += (zipCode != null ? zipCode.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof MicroMarket)) {
return false;
}
MicroMarket other = (MicroMarket) object;
if ((this.zipCode == null && other.zipCode != null) || (this.zipCode != null && !this.zipCode.equals(other.zipCode))) {
return false;
}
return true;
}
@Override
public String toString() {
return "org.letouilleur.demo.MicroMarket[zipCode=" + zipCode + "]";
}
}
A cet instant, je vais vous proposer une approche un peu différente. J’insiste lourdement sur le fait que ce n’est pas obligatoire mais intéressant. Play! propose d’utiliser une approche orientée DDD où les objets du domaine ne sont pas anémiques, mais capables d’effectuer des services simples. Pour cela, le pattern que j’utilise est de donner une référence à ce que l’on appelle le « Repository » dans DDD, et de l’injecter dans mon Entité. Grâce à une classe générique, dans laquelle l’EntityManager sera injecté, et dans laquelle je vais déclarer mes méthodes standards type CRUD, toutes mes Entités pourront alors exécuter du code d’accès au Repository.
Ce que nous allons voir n’est pas mieux ou moins bien que l’approche services/par couche que vous connaissez tous. J’ai envie de vous dire de laisser tomber les couches et de grandir pour faire un bon mot.
Play! propose (n’impose pas) d’étendre soit la classe JPASupport, soit la classe Model, afin que l’accès à l’EntityManager soit injecté par le framework. C’est un couplage fort, mais sur la modélisation du domaine ce n’est pas un souci. Je n’ai pas vu de projets avec de l’héritage d’Entité, et j’ai souvent vu que les problèmes de composition ou d’agrégation étaient résolus sans faire appel à de l’héritage de classes.
J’effectue d’abord 3 modifications : le package, un import en plus et l’extends :
// Fichier micromarket/app/models/org/letouilleur/demo/MicroMarket.java
// dans le répertoire de l'appli Play!
// Changement 1
package models.org.letouilleur.demo;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
// Changement 2
import play.db.jpa.*;
@Entity
@Table(name = "MICRO_MARKET")
@NamedQueries({
@NamedQuery(name = "MicroMarket.findAll", query = "SELECT m FROM MicroMarket m"),
@NamedQuery(name = "MicroMarket.findByZipCode", query = "SELECT m FROM MicroMarket m WHERE m.zipCode = :zipCode"),
@NamedQuery(name = "MicroMarket.findByRadius", query = "SELECT m FROM MicroMarket m WHERE m.radius = :radius"),
@NamedQuery(name = "MicroMarket.findByAreaLength", query = "SELECT m FROM MicroMarket m WHERE m.areaLength = :areaLength"),
@NamedQuery(name = "MicroMarket.findByAreaWidth", query = "SELECT m FROM MicroMarket m WHERE m.areaWidth = :areaWidth")})
// Changement 3
public class MicroMarket extends JPASupport implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "ZIP_CODE")
private String zipCode;
@Column(name = "RADIUS")
private Double radius;
@Column(name = "AREA_LENGTH")
private Double areaLength;
@Column(name = "AREA_WIDTH")
private Double areaWidth;
public MicroMarket() {
}
public MicroMarket(String zipCode) {
this.zipCode = zipCode;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public Double getRadius() {
return radius;
}
public void setRadius(Double radius) {
this.radius = radius;
}
public Double getAreaLength() {
return areaLength;
}
public void setAreaLength(Double areaLength) {
this.areaLength = areaLength;
}
public Double getAreaWidth() {
return areaWidth;
}
public void setAreaWidth(Double areaWidth) {
this.areaWidth = areaWidth;
}
@Override
public int hashCode() {
int hash = 0;
hash += (zipCode != null ? zipCode.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof MicroMarket)) {
return false;
}
MicroMarket other = (MicroMarket) object;
if ((this.zipCode == null && other.zipCode != null) || (this.zipCode != null && !this.zipCode.equals(other.zipCode))) {
return false;
}
return true;
}
@Override
public String toString() {
return "org.letouilleur.demo.MicroMarket[zipCode=" + zipCode + "]";
}
}
Ensuite, éditez le fichier micromarket/conf/application.conf de Play! afin d’activer une base de données. Nous allons utiliser une base en mémoire. Pas besoin de s’embêter avec le schéma, car Play! va créer une table MicroMarket identique à notre spécification, sans même avoir besoin de relancer le serveur.
A cet instant, si vous sauvez et que vous rechargez votre page, Play! compile le code, et vous serez notifié d’éventuelles erreurs. Pour l’instant nous n’avons pas d’entrées dans notre base, ni de page. Il faut continuer.
Allons encore plus loin. Les NamesQuery sont utilisables, mais je vais utiliser des fonctions de Play! afin d’avoir le support de la pagination intégré, sans devoir écrire cette logique dans une autre classe. Cela équivaut au code utilisant PaginationHelper de la classe MicroMarketController. Je n’invente rien. Avec ce que je vous montre nous n’avons pas besoin de déclarer ce système de PaginationHelper comme dans la version JSF, puisque c’est Play! qui vous le donne. Deuxième modification : je passe en public les attributs, puisque les getters/setters ne me servent à rien ici.
L’entité au final est donc encore plus simple :
package models.org.letouilleur.demo;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import play.db.jpa.*;
import java.util.*;
@Entity
@Table(name = "MICRO_MARKET")
public class MicroMarket extends JPASupport implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "ZIP_CODE")
public String zipCode;
@Column(name = "RADIUS")
public Double radius;
@Column(name = "AREA_LENGTH")
public Double areaLength;
@Column(name = "AREA_WIDTH")
public Double areaWidth;
public MicroMarket() {
}
public MicroMarket(String zipCode) {
this.zipCode = zipCode;
}
@Override
public int hashCode() {
int hash = 0;
hash += (zipCode != null ? zipCode.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof MicroMarket)) {
return false;
}
MicroMarket other = (MicroMarket) object;
if ((this.zipCode == null && other.zipCode != null) || (this.zipCode != null && !this.zipCode.equals(other.zipCode))) {
return false;
}
return true;
}
@Override
public String toString() {
return "org.letouilleur.demo.MicroMarket[zipCode=" + zipCode + "]";
}
/** Retourne la liste des MicroMarket en utilisant la méthode find hérité de JPASupport
* zipCode : critere de recherche
* page: numéro de la page à charger, si vous affichez un tableau paginé par exemple
* length: taille de la page, par exemple 10 pour charger 10 entrées
*/
public List<Micromarket> findByZipCode(String zipCode, int page, int length) {
return find("from MicroMarket m where m.zipcode like :p").bind("p",zipCode).fetch(page,length);
}
//.. autre finder
}
Voilà , comme vous pouvez le constater, ce n’est pas une révolution, simplement une approche différente pour le domaine.
La partie Java EE 6Pour commencer, je vais regarder comment fonctionne la page qui donne la liste des Entités, avec la pagination. Dans la version JSF, nous avons un ManagedBean, la class MicroMarketController. Celui-ci utilise un EJB Stateless, MicroMarketFacade, qui donne accès à l’EntityManager, un DAO en quelque sorte.
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
cq.select(getEntityManager().getCriteriaBuilder().count(rt));
javax.persistence.Query q = getEntityManager().createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
}
Sa spécialisation en classe MicroMarketFacade est super simple et propre :
package org.letouilleur.demo;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class MicroMarketFacade extends AbstractFacade<Micromarket> {
@PersistenceContext(unitName = "WebApplication1PU")
private EntityManager em;
protected EntityManager getEntityManager() {
return em;
}
public MicroMarketFacade() {
super(MicroMarket.class);
}
}
Jusqu’ici, on voit qu’avec 2 classes et Java EE 6 vous pouvez faire l’équivalent de ce que vous avez l’habitude de faire avec Spring par exemple. Je trouve le code simple et efficace.
JSF et la partie ManagedBeanAttention là c’est un poil plus compliqué. La classe MicroMarketController est un ManagedBean JSF, capable de gérer la pagination. Le moins que l’on puisse dire, c’est que ce n’est pas simple.
Pour être plus équitable, j’ai retiré la pagination, et l’on voit alors que le code est simple, pas plus compliqué que la version Play! Framework. La version originale est plus complexe, avec la gestion de la pagination et un Converter pour retenir l’élément sélectionné. S’il y a possibilité de critiquer JSF, c’est sur cette partie, que je vous laisse regarder dans le fichier original.
package org.letouilleur.demo;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
@ManagedBean (name="microMarketController")
@SessionScoped
public class MicroMarketController {
private DataModel items = null;
@EJB private org.letouilleur.demo.MicroMarketFacade ejbFacade;
public MicroMarketController() {
}
private MicroMarketFacade getFacade() {
return ejbFacade;
}
public String prepareList() {
recreateModel();
return "List";
}
public DataModel getItems() {
if (items == null) {
items = new ListDataModel(getFacade().findAll());
}
return items;
}
private void recreateModel() {
items = null;
}
}
Et si nous écrivions le controleur de la version Play ? Vous êtes prêt ?
Ouvrez la class app/controllers/Application.java et ajouter une nouvelle méthode static list comme ci-dessous:
// CODE PLAY dans app/controllers/Application.java
package controllers;
import play.mvc.*;
import models.org.letouilleur.demo.MicroMarket;
import java.util.List;
public class Application extends Controller {
public static void index() {
render();
}
public static void list() {
List listOfMicroMarkets=MicroMarket.findAll();
render(listOfMicroMarkets);
}
}
Voilà , c’est tout.
La vueSi vous le voulez bien, terminons par la vue. Pour Play c’est assez simple, voir un peu simpliste. Créez une page list.html dans le répertoire views/Application. La page portant le même nom que la méthode du contrôleur, elle sera chargée automatiquement par Play!
#{extends 'main.html' /}
#{set title:'List of MicroMarket' /}
List of MicroMarket
#{list items:listOfMicroMarkets, as:'currentMicroMarket'}
${currentMicroMarket.id} ${currentMicroMarket.zipCode} ${currentMicroMarket.radius} ${currentMicroMarket.areaLength} ${currentMicroMarket.areaWidth}
#{/list}
Si vous sauvez cette page et que vous testez… petit déception. Il n’y a rien dans notre base de données. Comment tester ? Et bien nous allons créer un Bootstrap (comme avec Grails) afin de charger un fichier YAML. Ce fichier contiendra 3 entrées pour tester.
Créez un fichier BootStrap.java dans le répertoire app de Play:
import play.Play;
import play.jobs.*;
import play.test.*;
import models.*;
import models.org.letouilleur.demo.*;
@OnApplicationStart
public class BootStrap extends Job {
public void doJob() {
if (Play.mode == Play.Mode.DEV) {
Fixtures.load("test-data.yml");
}
}
}
Ensuite créez un fichier test-data.yml dans le répertoire conf:
models.org.letouilleur.demo.MicroMarket(m1):
zipCode: 95051.0
radius: 255.59
areaLength: 689.856
areaWidth: 478.479
models.org.letouilleur.demo.MicroMarket(m2):
zipCode: 33740.0
radius: 12.59
areaLength: 389.52
areaWidth: 528.41
models.org.letouilleur.demo.MicroMarket(m3):
zipCode: 89211.0
radius: 120.3
areaLength: 39.856
areaWidth: 452.52
Relancez le serveur, et chargez alors la page pour lister nos entrées ([localhost:9000]). Hop voilà la liste des entrées de la base. Notez que la page est moche par rapport à la version JSF.

La version JSF est plus complète, mais on va revenir là dessus à la fin:

Et pour terminer, regardons le code la partie JSF, dans le fichier List.xhtml. J’ai retiré la pagination afin d’alléger la page :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<ui:composition template="/template.xhtml">
<ui:define name="title">
<h:outputText value="#{bundle.ListMicroMarketTitle}"></h:outputText>
</ui:define>
<ui:define name="body">
<h:form styleClass="jsfcrud_list_form">
<h:panelGroup id="messagePanel" layout="block">
<h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/>
</h:panelGroup>
<h:outputText escape="false" value="#{bundle.ListMicroMarketEmpty}" rendered="#{microMarketController.items.rowCount == 0}"/>
<h:panelGroup rendered="#{microMarketController.items.rowCount > 0}">
<h:dataTable value="#{microMarketController.items}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px">
<h:column>
<f:facet name="header">
<h:outputText value="#{bundle.ListMicroMarketTitle_zipCode}"/>
</f:facet>
<h:outputText value="#{item.zipCode}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{bundle.ListMicroMarketTitle_radius}"/>
</f:facet>
<h:outputText value="#{item.radius}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{bundle.ListMicroMarketTitle_areaLength}"/>
</f:facet>
<h:outputText value="#{item.areaLength}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{bundle.ListMicroMarketTitle_areaWidth}"/>
</f:facet>
<h:outputText value="#{item.areaWidth}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value=" "/>
</f:facet>
</h:column>
</h:dataTable>
</h:panelGroup>
<br />
</h:form>
</ui:define>
</ui:composition>
</html>
Alors pour enfoncer le clou, je propose de piquer la CSS de JSF, de mettre un tableau HTML simple, et de voir ce que cela donne. Play! Framework utilise le langage Groovy comme moteur de template dans la vue. Cela rend plus simple l’écriture des pages, mais ne permet pas de se faire aider lors de la création des pages, comme avec JSF dans NetBeans. Il y a donc un risque d’erreur. La bonne nouvelle, c’est que vous n’avez pas à arrêter Play! pour voir vos modifications. Il suffit de recharger la page dans votre navigateur.
Et le code HTML associé :
#{extends 'main.html' /}
#{set title:'List of MicroMarket' /}
<h2>List of MicroMarket</h2>
<P>Play! Framework</P>
<table border="0" cellpadding="2" cellspacing="0" rules="all" style="border:solid 1px">
<thead>
<tr class="">
<th scope="col">ZipCode</th>
<th scope="col">Radius</th>
<th scope="col">AreaLength</th>
<th scope="col">AreaWidth</th>
</tr>
</thead>
<tbody>
#{list items:listOfMicroMarkets, as:'currentMicroMarket'}
<tr class="jsfcrud_${currentMicroMarket_parity}_row">
<td>${currentMicroMarket.zipCode}</td>
<td>${currentMicroMarket.radius}</td>
<td>${currentMicroMarket.areaLength}</td>
<td>${currentMicroMarket.areaWidth}</td>
</tr>
#{/list}
</tbody>
</table>
Analyse des 2 approches
Que pensez-vous de la partie vue de la version JSF ? Objectivement, j’ai l’impression d’écrire en tag JSF du code HTML. Je sais la puissance de JSF et que je peux gagner du temps, mais au prix d’une complexité dont je n’ai pas besoin dès le départ. Côté Play! Framework, les tableaux paginés et triés existent aussi, grâce aux librairies de jQuery. D’ailleurs, le code généré par JSF utilise aussi la librairie jQuery. Au final cela ne change pas grand chose dans le navigateur. Donc je préfère la simplicité de Play! Framework à l’approche complète de JSF, mais il faut reconnaître que JSF sera en mesure de construire des interfaces plus riches que Play!, qui reste très basique.
Côté serveur, la partie Entité et DAO ne change pas beaucoup. La philosophie est différente, mais cela correspond à une manière de coder. Le ManagedBean et son Converter dans la version complète est lui aussi un peu compliqué. Pourquoi avoir un DataModel (regardez le code de la méthode List) alors qu’une List d’entité ferait l’affaire ?
ConclusionAprès avoir vu tout ce code, on voit bien la différence d’approche. Il n’y a pas de vainqueur, il y a deux approches différentes. Côté Model et Controleur, c’est du pareil au même. A part l’approche orientée DDD de Play! nous n’avons pas vu de grosses différences. Côté vue, j’ai le choix entre JSF qui me permet d’écrire plutôt une application type client riche, ou Play! qui me laisse me débrouiller avec ma page HTML.
La conclusion ?
C’est parce que Play! Framework est proche de ce que nous avons déjà l’habitude de faire que je vous recommande de regarder. Il vous faudra quelques heures à peine pour vous en servir, et vous serez surpris. Productivité, plaisir et impression d’avancer.
Références:
Le code du projet Play! zippé et du projet JSF sont disponible ici: [touilleur-express.fr].

Parce que c’est l’été, qu’il fait chaud, et que depuis 4 mois je ne parle QUE de Play! Framework, après ne vous avoir parlé QUE de Grails cet hiver, je me suis dis qu’il était temps de parler un peu de JavaServer Faces et de tester NetBeans 6.9. D’ici quelques minutes vous serez en mesure de construire une application type CRUD (Create, Update, Research, Update and Delete) avec JSF 2, un bean Stateless Java EE 6 et une entité JPA.
Pour vous accompagner durant ce vol, installez vous confortablement, prenez le pack de 178Mo de NetBeans 6.9 pour ne pas perdre de temps avec un IDE des années 90, et en avant l’aventure.
Ce que je souhaite faire, c’est vous montrer comment écrire en quelques minutes une application Web légère, à la mode de Play! Framework, mais en travaillant avec Java EE 6.
Une fois NetBeans démarré, créez un nouveau projet, et sélectionnez « Java Web/Web Application ».

(Cliquez sur l’image ci-dessous pour l’afficher en grand)
Je garde le nom proposé par NetBeans de « WebApplication1″, je décide d’utiliser le serveur GlassFish et d’utiliser Java EE 6. Ecran suivant, j’active Hibernate et JSF2 car nous allons en avoir besoin dans quelques minutes.

(Cliquez sur l’images pour l’afficher en grand… oui je l’ai déjà dit ci-dessus)
L’environnement est pré-configuré avec une base Apache Derby.
Cliquez sur Finish, NetBeans créé un projet prêt à être déployé.
Générer une Entité, un Controleur et une Facade
Je vous propose de vous montrer comment générer des pages type CRUD en quelques minutes, le tout avec NetBeans, sans taper une ligne de code.
Dans l’onglet « Services » en haut à gauche, cliquez sur Databases > jdbc:derby://localhost:1527/sample. Clique droit, et sélectionnez Connect… Vous verrez alors différents catalogues. Sélectionnez « APP », puis dans Table vous verrez qu’il y a plusieurs Tables préconfigurées : CUSTOMER, DISCOUNT_CODE, et d’autres. Nous avons donc de quoi générer des Entités.
Cliquez sur l’onglet « Projects » en haut à droite, puis sur le répertoire « Source Packages », faites un clique droit sur ce répertoire pour sélectionner ensuite « Entity Classes from Database » dans le menu contextuel :

Après avoir sélectionné « jdbc/sample » dans la liste DataSource, sélectionnez une des Tables. J’ai pris MICRO_MARKET. Sur l’écran suivant, créez un package org.letouilleur.demo puis cliquez sur « Finish ». Le code de l’Entité généré est très complet :
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.letouilleur.demo;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
/**
*
* @author nicolas
*/
@Entity
@Table(name = "MICRO_MARKET")
@NamedQueries({
@NamedQuery(name = "MicroMarket.findAll", query = "SELECT m FROM MicroMarket m"),
@NamedQuery(name = "MicroMarket.findByZipCode", query = "SELECT m FROM MicroMarket m WHERE m.zipCode = :zipCode"),
@NamedQuery(name = "MicroMarket.findByRadius", query = "SELECT m FROM MicroMarket m WHERE m.radius = :radius"),
@NamedQuery(name = "MicroMarket.findByAreaLength", query = "SELECT m FROM MicroMarket m WHERE m.areaLength = :areaLength"),
@NamedQuery(name = "MicroMarket.findByAreaWidth", query = "SELECT m FROM MicroMarket m WHERE m.areaWidth = :areaWidth")})
public class MicroMarket implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "ZIP_CODE")
private String zipCode;
@Column(name = "RADIUS")
private Double radius;
@Column(name = "AREA_LENGTH")
private Double areaLength;
@Column(name = "AREA_WIDTH")
private Double areaWidth;
public MicroMarket() {
}
public MicroMarket(String zipCode) {
this.zipCode = zipCode;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public Double getRadius() {
return radius;
}
public void setRadius(Double radius) {
this.radius = radius;
}
public Double getAreaLength() {
return areaLength;
}
public void setAreaLength(Double areaLength) {
this.areaLength = areaLength;
}
public Double getAreaWidth() {
return areaWidth;
}
public void setAreaWidth(Double areaWidth) {
this.areaWidth = areaWidth;
}
@Override
public int hashCode() {
int hash = 0;
hash += (zipCode != null ? zipCode.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof MicroMarket)) {
return false;
}
MicroMarket other = (MicroMarket) object;
if ((this.zipCode == null && other.zipCode != null) || (this.zipCode != null && !this.zipCode.equals(other.zipCode))) {
return false;
}
return true;
}
@Override
public String toString() {
return "org.letouilleur.demo.MicroMarket[zipCode=" + zipCode + "]";
}
}
La Table Micro_Market a pour PRIMARY_KEY une clé technique de type NUMERIC. Comme je le disais sur Twitter hier soir, NetBeans 6.9 génère les méthodes hashCode() et equals() en se basant sur l’id technique, pour peu évidemment qu’il soit présent. Moi je trouve que c’est une bonne chose.
J’en ai parlé en 2009 lorsque j’avais testé SpringFuse et plus récemment dans un article en juin, peut-être pas assez complet je pense.
Générer des pages CRUD avec JSF 2.0
Pour continuer, voyons comment générer quelques pages comme list, create, edit et delete avec JSF. L’approche proposée par NetBeans est simple, elle utilise une Facade sous la forme d’un EJB Stateless et un Controleur, sous la forme d’un ManagedBean.
Cliquons à nouveau sur le répertoire « Source Package » et sélectionnons « New>JSF Pages from Entity Classes ». Sélectionnez alors votre entité, puis sur l’écran suivant précisez où vous souhaitez stocker la partie Session, les pages JSF et enfin le répertoire pour les pages. Dans la zone JSP Pages Folder je n’ai rien précisé.
NetBeans génère une Facade, un Contrôleur et quelques pages JSF. Je vous présenterai les différences d’approche entre la version JSF 2 et une version Play! Framework dans un deuxième article.
Test final
Il est temps de démarrer le serveur et de tester. Cliquez sur « Run Main Projet » (F6). GlassFish se lance rapidement et la page d’accueil permet de sélectionner l’option »

En quelques minutes, NetBeans génère un petit projet complet avec une Entity, une partie JSF simple, et quelques pages type CRUD, ce qui donne une bonne base de départ. J’aime l’aspect couteau-suisse de NetBeans : simple, propre, facile à mettre en oeuvre. Pour débuter avec Java EE 6, je pense que c’est un bon outil, qui permet d’aller à l’essentiel sans perdre de temps à installer ou configurer quoique ce soit.
A tester donc !
Dans le prochain article : comparaison de l’approche JSF 2 par rapport à Play! Framework Références
Introduction to JavaServer Faces 2.0 with NetBeans
One of the new features in the umbrella Java EE 6 specification is the ability to define the order in which modules (web applications for instance) from a given Java EE application are initialized by the container. This might be useful if you want for example a given module to serve as resource initializer to create a database table before any other module can be accessed (note this does not apply to application client modules). Previously, the order in which Java EE application modules were initialized was unspecified and by default this is still the case in Java EE 6.
To explicitly request modules to be started in a particular order, the application should use <initialize-in-order>true</initialize-in-order> in the the EAR's application.xml deployment descriptor. The container will then start the modules in the order they are declared in that same configuration file (note that application.xml is optional by default and should be placed in the EAR's top-level META-INF/ directory). The short example below shows an EJB singleton creating a database table upon creation and dropping it before destruction. With this setup, the database table should always be accessible to the web application.
InitDB.java (a singleton packaged in OrderMatters-ejb.jar) :
@Singleton
@Startup
public class InitDB {
@PostConstruct
void createDBtable() {
//...
}
@PreDestroy
void dropDBtable() {
//...
}
}
The application.xml deployment descriptor for OrderMatters.ear :
<application version="6"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/application_6.xsd">
<initialize-in-order>true</initialize-in-order>
<display-name>OrderMatters</display-name>
<module>
<ejb>OrderMatters-ejb.jar</ejb>
</module>
<module>
<web>
<web-uri>OrderMatters-war.war</web-uri>
<context-root>OrderMatters-war</context-root>
</web>
</module>
</application>
Full details are available in the Java EE 6 platform specification, section EE.8.5.4. Of course you can use this today in GlassFish.
As an alternate solution if you're willing to use features in GlassFish 3 beyond what Java EE 6 provides, you may also solve the problem by breaking the application into different OSGi bundles and using a combination of BundleActivator and ServiceTracker as shown in this sample from Sahoo). This can in some cases offer a more suitable and loosely-coupled approach.
(Note: cet article est une adaptation libre en Français du post en anglais de Bertrand Delacrétaz)
Cher Oracle
Je suis développeur Java. Dans la vie, mon métier consiste à coder des logiciels en utilisant Java, un langage porté par SUN Microsystems depuis des années. Depuis que tu as racheté SUN Microsystems, je comprends très bien que tu fasses des efforts pour porter le langage et la communauté. Mais aujourd’hui je t’écris pour te faire part de ma vive déception. Je reste poli, mais le cÅ“ur y est…
Lorsque je développe, j’ai souvent besoin de regarder la documentation du langage Java. Pour cela, le plus simple est simplement de passer par Google. Je saisie le nom d’une Classe dans la zone de recherche et je m’attends alors à trouver la Javadoc. Cela me permet aussi lorsque j’écris des articles sur ce Blog, de donner des références à mes lecteurs afin de leur permettre de trouver de l’information.
Il y a quelques jours, j’ai constaté que tu avais décidé de rediriger les URLs des adresses des pages de la documentation du langage Java.
Je t’explique:
- lorsque tu tapes « IndexOutOfBoundsException » dans Google afin de retrouver rapidement la documentation de cette classe Java, historiquement nous tombions sur l’URL suivante :
- mon souci aujourd’hui c’est que cette URL est redirigée vers une obscure URL sur le site d’Oracle:
Au nom de la communauté des développeurs Javas, j’aimerai donc que tu reviennes aux URLs classiques, celles que je connais depuis 1996, et qui n’avaient jamais changé jusqu’à aujourd’hui
Bien à toi,
Nicolas
Références:
Dear Oracle, can we have our nice javadoc URLs back?.
Twitter fight for #E17476.
Parlez-en via Twitter à John Clingan, PM de GlassFish qui est conscient du problème.
J’ai vu que la session sur la Stratégie des Tribus chez les Geeks avait été retenue dans les 9 premières parmi toutes les sessions de l’USI 2010. La vidéo de 20 minutes est en ligne, et je viens de mettre en ligne les slides de la présentation.
Je vais continuer à travailler sur ce sujet. A priori je devrai en parler sous la forme d’une Keynote à la conférence Soft-Shake à Genève à la rentrée. C’est une conférence sur Java, l’Agilité, le développement iPhone et le développement en général. J’aimerai aller voir aussi quelques Java User Group à partir de la rentrée, pour parler développement, passion et vous rencontrer.
En attendant, merci encore une fois à Octo Technology et en particulier à Pierre Piezzardi qui m’a aidé, et retenu pour cette session de 2010.
La vidéo:
(Ouvre la vidéo dans une autre fenêtre)
Les slides:
Usi2010 presentation nmartignole slideshare View more presentations from Nicolas Martignole.
I'm excited to be soon on board a flight to Brazil, to attend FISL. This is my first time in the country and I wish I could spend some time in Rio but this time it will only be a few hours waiting for the connecting flight to Porto Alegre (btw, funny how most people here in France think of anti-globalization protests when you mention Porto Alegre). Sadly, I already have one regret - not meeting Felipe in his country.
I've heard many things about Brazil and FISL and particular. The conference sounds pretty large and the vast majority of talks are *not* in English, which is a good thing (tm). I'll be speaking on the following two topics :
• "GlassFish OSGi - from modular runtime to hybrid applications." (Wednesday)
• "GlassFish, the future of the community." (Friday)
The full agenda is here (assuming the server responds).
Expect a trip report with photos and slides by the end of the week (assuming I have the energy, of course).
Finally !
During a long period of calm, I finally released a new version (with new features) of the Android client for remote galleries Gallery2 (your photos on your website), G2Android.
If you have a look at the G2Android project homepage, you will see that the following issues (bug and enhancements) have been closed :
Version 1.5.0, 19th of July 2010 Major release
The major new feature is clearly the « add photo to gallery » feature : I created a new Activity, UploadPhoto , which can be called from 2 external intents :
<activity android:name=".activity.UploadPhoto" android:label="@string/upload_photo_title" >
<intent -filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent>
</activity>
So now the user can send a new photo or a batch of photos from another application, the android gallery app for example; the big work was then to decode the URIs of the photos to find the photo file on the phone, and then send it to the gallery; also I had to make sure that the user is still connected to the gallery, if not, he must login again.
Also, the user is now able to take a picture and send it to his gallery, without leaving g2android; this has been done adding the camera permission in the AndroidManifest.xml :
<uses -permission android:name="android.permission.CAMERA"></uses>
This is the easy part ![]()
Then, when your app receive a photo from the Camera, it does not receive an URI pointing to a photo file; nope, you get a Bitmap object you have transform into a file, to be able to send it to the remote gallery :
Bundle extras = intent.getExtras();
Bitmap bm = null;
Object o = extras.get("data");
if (o != null && o instanceof Bitmap) {
bm = (Bitmap) o;
try {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(Settings
.getG2AndroidPath(this));
stringBuilder.append("/");
StringBuilder stringBuilderFileName = new StringBuilder();
stringBuilderFileName.append(fileName);
stringBuilderFileName
.append(System.currentTimeMillis());
stringBuilderFileName.append(".jpg");
stringBuilder.append(stringBuilderFileName);
imageFromCamera = new File(
stringBuilder.toString());
FileOutputStream fos = new FileOutputStream(
imageFromCamera);
bm.compress(CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
mImageUri=Uri.fromFile(imageFromCamera);
fileName = stringBuilderFileName.toString();
} catch (FileNotFoundException e) {
ShowUtils.getInstance().alertFileProblem(e.getMessage(),this);
} catch (IOException e) {
ShowUtils.getInstance().alertFileProblem(e.getMessage(),this);
}
}
I also optimized the application, issue #37 (Uploaded photo looses .jpg file extension) was in fact due to the fact that I re created the photo file before sending it; instead of using a projection of the URI to get its path on the phone :
public static String getFileNameFromUri(Uri uri, Activity activity) {
String[] projection = { MediaStore.Images.ImageColumns.DISPLAY_NAME };
String fileName=null;
Cursor c = activity.managedQuery(uri, projection, null, null, null);
if (c != null && c.moveToFirst()) {
fileName = c.getString(0);
}
return fileName;
}
Also shipping with this new version, Chinese i18n thanks to the chinese android market, GoAPK and also new art from Dan, who just posted a comment to the blog proposing to add new art; thanks again to you both ! You make the application richer !
So now, what remains to be done ? well, the compatibility with Gallery3, as the G3 remote API is almost stable now, thanks to the work of Bharat, Tim, and many others; a java implementation is already under work, I will check if I can use it instead of… re inventing the wheel !
More details to come, for sure !
You can download G2Android from the Android Market, SlideMe, Applibs, etc.. and also from the G2Android project homepage
.
Enjoy this app as much as I enjoy working on it, and if you like it, don’t forget to flattr me
!
2ème partie consacrée à la Keynote de Martin Fowler et de Neal Ford après l’introduction consacrée à la plannification.

Neal Ford, Crédit photo : USI 2010 album sur Flickr.com
De l’importance de la communication
Après cette première partie, Neal Ford nous parle maintenant de la communication. Plus importante que la technologie, nous allons voir que la communication est l’un des points clés pour réussir des projets.
Neal demande à la salle si nous avons déjà fait partie de projets qui se sont plantés. Rires, quelques mains se lèvent. Il demande ensuite si la raison de l’échec était le mauvais choix d’une technologie, ou une mauvaise communication ? L’ensemble répond : la communication.
Il est donc plus facile de planter un projet car vous communiquez mal, que parce que vous avez pris un framework exotique au lieu de prendre un framework standard.
Les projets se plantent souvent à cause des gens. La communication entre les gens devient très importante. Nous sommes des créatures massivement communicantes. Notez qu’en prison, la plus grosse punition est d’aller au mitard. De ne plus pouvoir communiquer avec d’autres humains… Dingue non ? Pensez aussi aux gens que l’on met « au placard »… Nous avons besoin de communiquer. C’est vital.
Alistair Cockburn explique dans un graphe que la qualité de la communication avec les outils modernes est très inégale.

Pour travailler, nous sommes bien plus efficace devant un tableau blanc qu’au téléphone, ou même pire, via un document Word. Le pire des processus de communication est le papier écrit. Et le drame, c’est que c’est l’un des plus utilisés dans les Entreprises. C’est marrant, mais la semaine dernière je suis allé chercher un grand tableau blanc pour notre équipe, et je l’ai installé dans notre bureau… Croyez-moi cela marche.
Neal Ford explique que c’est pour cette raison, qu’il est illusoire de croire qu’une spécification technique envoyé à des développeurs en Inde donnera le logiciel escompté. C’est une perte de temps et d’argent. Cela ne fonctionne pas.
Cela va plus loin. Nous avons même une capacité limitée à communiquer et faire autre chose en même temps. Vous ne vous êtes pas demandé pourquoi il est dangereux de téléphoner et conduire en même temps ? Pourtant vous avez le droit de parler avec votre voisin, vous pouvez écouter la radio, mais on vous interdit de téléphoner en même temps. Or pour ceux qui ont essayé (moi le premier) vous vous rendrez compte que la communication au téléphone est moins bonne que lorsque vous avez la personne à côté de vous. Cela vous demande même un effort plus important pour comprendre. Et cet effort vous déconcentre de la route. C’est bien là la preuve que les canaux de communications demandent plus ou moins d’efforts.
Un document écrit est aussi très destructif, car la possibilité de donner son retour n’existe pas ou peu, par rapport à une communication face à face. Bien entendu, ces documents sont souvent écrits à la suite de réunions, où nous nous sommes vus… Mais souvent le développeur n’aura pas eu l’opportunité de discuter avec le client, et de poser quelques questions simples. Il est donc primordial pour réussir un projet de prendre en compte ce facteur de communication.
Le manifeste Agile propose 4 valeurs clés, dont l’une est exactement ce que Neal Ford vient d’expliquer.
Les quatre valeurs fondamentales Agiles sont :
– Davantage l’interaction avec les personnes que les processus et les outils.
– Davantage un produit opérationnel qu’une documentation pléthorique.
– Davantage la collaboration avec le client que la négociation de contrat.
– Davantage la réactivité face au changement que le suivi d’un plan.
Voir l’article original en Anglais : [agilemanifesto.org]
Neal Ford présente ensuite un projet supporté par ThoughWorks au Malawi. Ce projet permet à des infirmières de transmettre via SMS des bilans de santé, alors que les moyens de communications sont très mauvais, et que la vie est très dure. Ce projet RapidSMS, est un projet open-source réalisé pour l’UNICEF en Python.
La communication dans ce projet est vitale, et elle permet de sauver des vies.
Le Feedback
Martin Fowler attaque maintenant la deuxième partie de sa présentation. Pourquoi certains projets réussissent bien ? Il souhaite nous parler de l’importance du retour d’information, le feedback en Anglais.
Martin nous montre une photo d’un gâteau. Réalisé avec une approche prédictive, tout le monde sait qu’il faut respecter la recette en cuisine pour réussir. Ma grand-mère me disait de mettre 75g de farine, et de ne pas poser de questions. La cuisine est une alchimie intéressante. Si vous avez une recette pour 4 et que vous voulez faire un gâteau pour 8, il ne faut pas doubler les quantités. En effet, lorsque vous doublez les quantités, vous avez toutes les chances de planter votre gâteau. Curieusement, la cuisine est bien plus compliquée que ce que nous pensons. Et bien le développement logiciel, c’est pareil. Il ne sert à rien d’ajouter 2 développeurs en pensant que vous irez 2 fois plus vite. Parfois même, vous irez 2 fois moins vite, car il faudra former ces nouveaux arrivants…
Martin nous montre une photo de gâteau donc, et une photo de pomme de douche. Quelles différences y-a-t-il entre une pomme de douche « chaud-froid » et un gâteau ? Et bien une histoire de retour, de feedback.
La cuisine est un processus défini alors que régler une douche est un processus adaptatif/empirique.
La cuisine suit un plan précis, une recette. Et le feedback ne sera fait qu’à la fin. Peut-être que votre gâteau sera raté, peut-être qu’il sera excellent, vous ne le saurez qu’à la fin. Au contraire, si vous prenez une douche dans un Hôtel, et que vous devez régler la température, vous allez utiliser un feedback permanent pour adapter la température. C’est l’approche Agile.
Cette illustration nous permet de comprendre qu’il existe 2 types de processus, et que cela fait partie de notre vie quotidienne. Dans le cas d’un processus empirique (la douche) nous examinons le résultat final pour adapter le signal d’entrée. Dans le cas d’un processus défini, si je suis la recette à la lettre j’aurai toujours le même gâteau, je serai capable de reproduire à l’identique la même chose.
Or chaque développement de chaque projet est différent et donc l’approche prédictive ne semble pas une bonne chose. Par contre pour mélanger des ingrédients chimiques dans une usine, vous serez d’accord qu’un processus défini est primordial, pour des raisons de sécurité. Pour le développement d’un logiciel, Martin Fowler nous demande de bien réfléchir avant de choisir une méthode de développement.
Si vous prenez l’approche empirique (la douche) pour construire votre logiciel, il est donc très important de mettre en place un système de feedback. C’est pour cette raison que les équipes Agiles s’installent des murs de post-it, des Kanban, des indicateurs visuels et toutes sortes de trucs sympas : pour avoir du feedback disponible à tout moment.
Martin Fowler montre la photo d’un immeuble de 20 étages en Chine. On voit qu’au 15ème, les fenêtres sont couvertes de post-it. C’est l’étage de ThoughWorks, facilement identifiable de la rue… Rires dans la salle.
L’intérêt d’un Kanban est que ce tableau est lisible par tout le monde. Ecrit clairement, il donne une vision de l’avancement du projet. Tout le monde peut y participer, et donc doit pouvoir y accéder facilement.

Feedback sur la construction du logiciel
Martin Fowler insiste ensuite sur l’importance de donner un indicateur sur l’avancement de la construction du logiciel. Nous devons savoir où nous en sommes en terme de développement du logiciel.
L’intérêt d’afficher sur le mur le planning de son projet est primordial. Martin Fowler explique qu’il lui arrivait auparavant d’aller dans des équipes de développement, et de constater que les développeurs n’avaient pas accès au planning global du projet. Mettez en place un tableau avec les prochaines semaines de développement, cela permettra de donner plus de visibilité et donc de sens, au travail de chacun.
A propos des outils électroniques, les équipes de développement préfèrent utiliser un vrai tableau plutôt qu’un logiciel. Je confirme : ne vous jetez pas sur un outil, privilégiez une solution simple à base de post-it et de fiches bristols. Cela fonctionne très bien.
Dans ce qui est de donner du feedback, Martin rappelle que le seul moyen de voir un progrès dans le développement d’un logiciel, c’est d’avoir un logiciel qui marche. Cela veut aussi dire, un logiciel déployé et testé.
Le processus de construction de votre logiciel est très important. Certains projets aiment bien utiliser des Lava Lampes rouges ou vertes pour signaler que la construction du logiciel fonctionne, ou non. A titre personnel, j’ai mis en place cette pratique à la BNP il y a un an et nous avions une Lava Lampe rouge que nous allumions pour signaler un « Build failed ». C’était sympa.
Neal Ford parle ensuite de CCBoard, un tableau de bord de construction de projets. Ce logiciel open-source permet d’afficher le status de toutes vos builds.
Faire de l’intégration continue c’est compiler, tester, packager, déployer, retester et valider un logiciel. Cela demande un effort, qui permet cependant de réduire à zéro l’effort de « release » d’un logiciel. Si vous êtes capable de construire à tout moment votre logiciel, et de le packager, vous comprendrez que faire « une release » devient facile.
A propos des pratiques de développement logiciel, Martin Fowler parle du Pair Programming. Il a été observé que lorsque 2 développeurs travaillent en même sur un écran, les deux n’utilisent pas la même partie de leur cerveau. Celui qui tape le code sur le clavier est dans la réalisation, alors que celui qui est assis à côté est dans la réflexion, la beauté du code et la vision globale. Celui qui code est le pilote, et celui qui est à côté est le navigateur. Cela permet de réaliser du code de meilleur qualité.
Martin utilise l’image d’un jardin de la Renaissance, tiré d’un château de la Loire. Puis ensuite l’image d’un jardin tropical, tiré d’un parc en Angleterre. D’un côté l’ordre, la clarté. De l’autre le chaos, le foutoir apparent. Et pourtant ces 2 jardins sont beaux. Ils correspondent à deux approches : l’une procédurale, l’autre artistique. Tout ceci pour illustrer qu’il faut des deux pour faire un monde. Et il nous encourage à mélanger ces 2 approches lorsque nous codons, en faisant du Pair Programming par exemple.
Dernière partie
« La perfection n’est pas ce que nous visons, mais ce que nous faisons à tout moment ». Cette phrase de Kent Beck résume l’approche eXtrem-Programming, où l’on fait de tout, mais très bien et en permanence.
L’introspection est alors important. Chaque semaine, l’équipe doit réfléchir et s’assurer de s’améliorer en permanence. Si une équipe ne change pas ses pratiques régulièrement, et qu’au bout de 12 mois vous la retrouvez dans le même état, c’est qu’elle a cessé de progresser. Et c’est un indicateur qu’il manque peut-être des pratiques de rétrospectives.
Neal Ford ensuite à propos de la communication et du retour, nous raconte un peu ses expériences passées. Dans les équipes de développement qu’il a croisé, il a remarqué que les équipes aiment bien laisser trainer des petits jeux, des casse-têtes ou des Rubbik’s Cub. Cela permet en fait de décompresser et de mobiliser d’autres parties du cerveau. Il y a 5 ans, je me souviens que nous avions un petit panier de basket, et que nous faisions des tournois, histoire de lever le nez du code de temps en temps…
Neal Ford dit clairement que mettre des développeurs face à un mur pour coder, n’est pas une bonne idée. Il faut stimuler leur créativité. Il y a des entreprises qui mettent en place des règles et qui vous interdisent d’afficher des photos personnelles, des posters de cinéma, ou de vous balader en tee-shirt « My bozz rebooted » dans les couloirs… Pensez à ces photos des locaux de Google, où à l’excès inverse, les gens peuvent avoir un peu tout et n’importe quoi dans leur espace de travail… La notion de « Cubicle » est cependant très américaine, et c’est un aménagement de bureaux peu utilisé en France.
Ce qu’il faut retenir, c’est qu’il important de traiter les développeurs comme des créatifs. Ils doivent pouvoir aménager leur espace de travail librement. Mettez des tableaux blancs, laissez-les s’installer et s’approprier leur bureau. Si vous n’avez que des prestataires qui viennent de SSII, croyez-moi c’est possible. Nous avions une lava-lampe, j’avais acheté une petite plante verte, nous avions nos posters Scrum, le tout en évidence à côté de la cafétéria, et personne ne nous a jamais dit d’arrêter.
A propos de la construction des logiciels, Neal Ford raconte une histoire sympa. Dans une des équipes où il a travaillé, le logiciel d’intégration continue joue une petite musique de 3 secondes lorsque la compilation fonctionne. C’est très pratique, car cela permet de vous signaler que vos derniers commits fonctionnent, sans vous déranger. Vous entendez vos 3 secondes de musique, et vous pouvez continuer. Chaque développeur avait sélectionné une chanson ou un bruit, et donc pouvait savoir que son commit était passé. Sympa non ?
Ensuite, lorsque le build cassait, une autre chanson se mettait en marche. Dans son équipe c’était « Oups I did it again ! » de Brittney Spears. Et d’entendre cette chanson mettait une bonne ambiance. Toute l’équipe se mobilisait pour aller réparer le logiciel immédiatement.
Neal Ford montre ensuite une photo d’une équipe de développement. On voit une énorme peluche de Kangourou assise sur le fauteuil à côté du développeur. Celui qui a le « Stuff Kangoroo » est responsable du build pour la journée. Lorsque la chanson de Brittney se met en marche, son travail est alors de chercher le développeur et de s’assurer que le logiciel est réparé rapidement. C’est un peu un rôle barbant, donc ce rôle tourne. Et celui qui a cassé le build récupère alors le « Stuff Kangoroo ». Et ainsi de suite…
Notre travail peut être amusant, et sérieux. Derrière cette peluche « pas sérieuse » il y a une pratique très précise de génie logicielle, celle de fixer tout de suite la construction du logiciel. Et ça marche ! Alors n’hésitez pas à aller chez Toyr’us et d’acheter un énorme Ours en peluche, et de le donner à l’équipe de développement. J’ai repéré une peluche de « Sully » du dessin animé « Monstres et compagnie » et je compte bien l’embarquer pour notre projet actuel.
Neal Ford montre enfin une page de Wiki généré automatiquement par l’outil de construction, sur laquelle les développeurs peuvent aussi écrire. Ce carnet de bord quotidien raconte la journée passée. A quelle heure Nicolas a commité son code… a quelle heure la compilation s’est terminée, puis les tests. Ensuite on voit que Pierre a annoté la page et qu’il a marqué un détail sur l’installation… Bref un carnet de bord, comme en marine, mais généré en partie automatiquement.
Conclusion
En conclusion, Neal Ford reprend la question du départ : « Pourquoi le développement Agile fonctionne-t-il si bien ?« . Et bien grâce au Feedback, grâce à la communication, et aussi parce que nous percevons le métier de développeur différemment. Nous pensons que la réflexion est aussi importante que la réalisation. Et nous pensons aussi que le développement est fun !

Crédit photo : USI 2010 flickr.com – Tous droits réservés
Martin Fowler et Neal Ford ouvrent cette deuxième journée de la conférence USI 2010. Deux des plus célèbres des Geeks pour commencer la journée… Avouez que cela vaut le coup non ? Leur présentation nous propose de comprendre non pas comment, mais pourquoi des logiciels fonctionnent… Suivez le guide.
Avant tout, je présente rapidement les deux speakers. Martin Fowler est d’origine anglaise, c’est un geek de 47 ans qui a participé au Manifeste Agile, a co-écrit des livres d’excellentes qualités sur le refactoring avec Kent Beck, et c’est surtout un conférencier de renom. Neal Ford est américain, Geek de 48 ans, passionné par la technologie, auteur de plusieurs livres comme l’excellent « The Productive Programmer« , il travaille aussi chez ThoughtWorks avec Martin Fowler.
Neal Ford débute la présentation en nous apostrophant, afin de nous demander si nous savons pourquoi certains logiciels marchent, pas comment ils marchent. Martin Fowler explique qu’une phrase anglaise célèbre dit : « Plan your work, work your plan« . Cette approche prédictive est intéressante. Un plan est une prédiction de ce que l’on souhaite, plutôt une prévision. Et pour aller plus loin, le succès d’un projet dans ce cas, serait de dire que vous avez respecté votre plan à la lettre. Le succès des projets est défini sur la base d’une prévision. Cette approche prédictive est intéressante dans certains domaines, mais elle doit être discutée lorsque l’on parle de développement logiciel. Elle ne fonctionne que si vous êtes en mesure de préparer un ensemble clair et indiscutable de demandes, et que cet ensemble n’évolue pas dans le temps.
Reconnaissez tout d’abord que c’est difficile. Il est assez difficile de tout prévoir, et de tout planifier. Et ce, d’autant plus que le projet est long.
Martin demande aux chefs de projets qu’il rencontre, si les exigences sont stables. Et c’est plutôt rare. Un sondage dans la salle remplie de près de 500 personnes montre aussi qu’en général, les demandes évoluent ou sont précisées alors que le développement a débuté. Presque personne n’a de demande stables. La communauté de l’approche traditionnelle le sait très bien. Alors ils cherchent à stabiliser et à figer les requierements. Ils mettent un point d’honneur à vous rendre la vie difficile si vous souhaitez changer quelque chose.
Dans le monde Agile, nous savons que le changement est une composante du développement logiciel. Cela nous permet de nous en servir comme d’un avantage, plutôt que de le subir. Nous avons développé des techniques pour absorber le changement, tout en délivrant le logiciel. La première de ces techniques, est de séparer la phase de recueil des exigences, de la phase d’implémentation. Pour parler de Scrum, nous avons une étape de capture des requierements, c’est l’alimentation du Product Backlog. Et nous avons par ailleurs un cycle de développement, qui travaille sur un périmètre stable. Vous voyez que nous avons bien besoin de figer à un moment donné les demandes, mais nous le faisons sur une petite période de 2 à 3 semaines.
How do we do this ?
Nous passons d’une approche prédictive à une approche adaptative. Le secret de l’Agilité c’est que l’on ne peut prévoir tout, mais que par contre on sait s’adapter. D’où ce mot « Agile » finalement. Faire de l’Agile ce n’est pas jeter des plannings. Au contraire, nous serons en mesure de donner un planning chaque semaine. Nous serons en mesure de prédire avec précision les 2 semaines qui arrivent.
Ensuite, pour réussir il ne faut pas uniquement appliquer des méthodes Agiles et penser que cela va réussir. Il faut absolument prendre de bonnes pratiques de programmation. Tests unitaires, intégration continue, refactoring, vous les connaissez tous je pense. Martin propose de relire un papier publié il y a 10 ans, remis au goût du jour en 2004, que chaque Architecte Agile devrait connaître : « Is Design Dead ?« . Faire de l’Agilité ce n’est pas jeter le Design à la poubelle. Au contraire.
Martin Fowler raconte qu’il va parfois dans certaines entreprises qui sont passées d’une approche classique à une approche Agile. Et les projets ne réussissent pas mieux. L’Agilité permet même de se planter plus vite en fait. Il rappelle l’importance des techniques de programmation et de développement telles que celles de l’eXtreme Programming. Faire de l’Agile sans changer sa méthode de travail ne permet pas de réussir mieux. A méditer lorsqu’un consultant de 19 ans de McKissé vous vend de l’Agilité… alors qu’il n’a jamais programmé.
Donc pour résumer cette première partie : passez de l’approche prédictive à l’approche adaptative.
La seconde distinction
Une photo de Taylor nous rappelle qu’au XXe siècle la vision du Taylorisme visait à séparer l’exécution d’une tâche de sa définition. Ecoutez bien ce qui va suivre, moi j’ai adoré. Il y a 100 ans, nous pensions que pour être plus effectif, il fallait que des gens pensent à ce qu’il faut faire, et que d’autres réalisent cette tâche. C’est le métier d’Ingénieur ou d’Architecte, ce métier où tu penses à ce qu’il faut faire. Mais dans le développement informatique, nous avons juste oublié la partie « réalisation », la partie « artisanale ». Et c’est pour cette raison que de très bons scientifiques, en mesure de penser, sont de très mauvais exécutants. Personne ne leur a appris à programmer.
Vous savez pourquoi il faut le faire, mais vous ne savez pas comment faire…
N.Martignole
L’approche traditionnelle du développement logicielle essaye de séparer ceux qui conçoivent de ceux qui réalisent. Cette vision fonctionne si les gens qui réalisent sont prévisibles. S’ils suivent à la lettre le processus standardisé, comme un ouvrier finalement, oui cette approche devrait marcher. Alistair Cockburne explique que les gens ne sont pas prédictibles :
In the title, [of his article] I refer to people as « components ». That is how people are treated in the process / methodology design literature. The mistake in this approach is that « people » are highly variable and non-linear, with unique success and failure modes. Those factors are first-order, not negligible factors. Failure of process and methodology designers to account for them contributes to the sorts of unplanned project trajectories we so often see.
[Alistair Cockburn non-linear]
Dans l’approche traditionnelle, nous pensons que les processus vont nous aider. Cela va plus loin, car certaines approches (Model Driven Architecture) proposent de retirer la possibilité de développer, pour plutôt générer du code. La génération automatique de code permettrait d’économiser du temps. Cette approche essaye de combattre le caractère imprévisible de l’être humain. Générer un logiciel par modélisation c’est mettre un terme au chaos de la programmation classique.
Je pense à titre personnel que l’approche MDA permet de déplacer la complexité, mais qu’elle ne peut pas être une solution pérenne pour développer des projets de bout en bout. Lorsque nous aurons compris que la programmation d’un logiciel complet ne peut pas être automatique, nous aurons fait un grand pas.
Les développeurs sont donc les personnages les plus importants dans le développement logiciel. Or ils ne sont pas prévisibles, il est donc stupide de voir les gens comme des ressources. L’utilisation du jour/homme fait beaucoup de tord à notre industrie. Je connais personnellement des personnes qui font en 1 journée ce que d’autres font en 20 jours. Et je me mets dans les 20 jours. Et inversement, je peux faire des choses en 1 journée qui demanderaient 20 jours à un autre développeur. Nous ne sommes pas égaux devant les problèmes de programmation. Nous ne pouvons donc pas prévoir la fin d’un projet en divisant le nombre de jours par la « quantité de ressources disponibles« . Mettez-vous cela dans le crâne une fois pour toute.
Alors comment cela fonctionne-t-il ? Martin Fowler explique que nous devons prendre un groupe de développeurs, mettre en place quelques règles, puis ensuite s’adapter et faire des rétrospectives afin de progresser. Il est contre-productif d’utiliser des processus et de la standardisation, cela tend à niveler par le bas les niveaux des équipes.
People comes first, and they chosse their own process they follow, not the opposite.
En résumé, Martin Fowler a parlé de l’attitude par rapport au planning, et de l’attitude par rapport aux gens.
Fin de la première partie
Retrouvez la suite de cette KeyNote dans un deuxième article demain

Yves Morieux est Senior Vice-President au bureau de Paris du Boston Consulting Group, cabinet de conseil en management et en stratégie d’entreprise. Sa Keynote de l’USI 2010 nous a embarqué au cÅ“ur de l’entreprise et de la complexité de notre métier, pour nous faire comprendre comment doit travailler l’IT. J’ai apprécié la qualité de cette présentation, et j’espère vous faire partager celle-ci maintenant.
3 énigmes
La question de la complexité est passionnante. Elle est là , au coeur de notre métier. Nous allons en parler, mais avant, allons voir 3 tendances énigmatiques intéressantes à étudier :
- la cause commune
- le facteur de productivité
- la satisfaction au travail
Le CEO aujourd’hui est en face d’un tableau à deux colonnes, où chaque idée est opposée à une contre-idée. Envie de renforcer ses finances ? Oui mais il faut investir. Envie d’innover ? Oui mais il faut limiter le risque… Envie de normaliser ? Oui mais il faut laisser de la flexibilité…
Il a donc un nombre important de facteurs à regarder lorsqu’il observe ses projets informatiques. Une étude conduite auprès de 700 PDG montre que le premier facteur de stress pour les CEO (PDG) n’est pas la santé financière, mais la mauvaise exécution des projets. Suit ensuite l’exécution constante par le management, puis la vitesse et la flexibilité, puis enfin de la performance globale économique de l’entreprise.
Le cauchemar du CEO serait l’exécution ? La réalisation de ses idées ? Est-ce qu’il devient difficile de trouver des talents ?
En 1973 nous arrivions à gagner environ 5% de productivité par an. Entre 1983 et 1995, en moyenne nous ne gagnons plus qu’entre 1 et 1.3% de productivité (voir les chiffres de productivité du GGDC Groningen Growth and Development Centre).
Mine de rien, c’est inquiétant. Ne plus créer de productivité c’est perdre de l’argent. Travailler coûte de plus en plus cher. C’est donc un problème majeur.
L’informatique aurait dû améliorer la productivité ces 20 dernières années, mais il semble que ce ne soit pas le cas. Rappelons l’an passé Pierre Piezziardi qui expliquait que certaines entreprises se sont informatisées sans changer, ce qui a eu pour effet de complexifier un système, sans vraiment améliorer la vie des salariés. Celles qui réussissent sont celles qui ont réussi la migration vers l’informatique, sans souffrir.
Une autre énigme est aussi un sondage assez inquiétant sur l’engagement des salariés. Globalement, vous sentez-vous content de travailler pour moi ou non ? Selon les populations, entre 11 et 23% des salariés ne sentent pas engagés. Un graphe présenté par Yves Morieux montre qu’aux USAs les gens en ce moment ne sont pas satisfaits de leur travail. En 2009, moins de 40% était satisfait… Mais où part cette satisfaction ?
Yves parle ensuite du désengagement actif. Il s’agit des salariés qui sabordent l’entreprise ou le projet de manière active. Pas de ceux qui ne font rien. Nous parlons bien de ceux qui donnent des coups dans la coque du bateau pendant que les autres au dessus rament… Et là le chiffre fait peur (NDLR: je retrouverai les sources que je n’ai pas notées) car 17% des managers de la population étudiée est démotivé et 26% des employés est désengagé activement… Imaginez l’effet dans une centrale nucléaire ou dans un avion…
Donc l’exécution stresse les patrons. La productivité ne s’améliore plus et tend à stagner. Les salariés se désengagent.

C’est grave docteur ?
Alors les entreprises appellent des Docteurs House au secours, pour diagnostiquer et trouver là où cela fait mal. En ce moment, la mode est d’ouvrir une Division Lean, chargée de visiter chacun des départements et de mettre en place des « Balance Score-Cards » et de mettre encore plus de processus en place. Yves Morieux parle de ‘Spaghetti Factory‘. On s’en doute, l’effet est radical sur les managers. D’un coup de baguette magique, les managers passent alors 40% de son temps à faire du reporting, 30% à assister à des réunions et 30% à réellement manager leurs équipes. La complexité omnisciente est là . Le Squelette de l’entreprise est malade. Il y a de plus en plus d’obstacles… Il dit clairement que l’application de la méthode Lean par des cabinets externes peut être parfois traumatisante pour les entreprises, sans créer de valeur. Quant à la discussion de savoir si le Lean industriel est approprié à toutes les entreprises… C’est un autre débat.
Je passe 70% de mon temps de manager à en perdre… Donc je me désengage. Si je peux plomber un peu la vie de mes voisins, si je peux défendre chèrement mon territoire, si je peux montrer que j’existe en criant fort, alors je serai encore manager…
La Standardisation est une idée qui peut aussi détruire la motivation, et qui peut rendre la vie d’un manager difficile. Prenez le cas de cette entreprise américaine, avec 25 divisions. Cette organisation matricielle (il nous montre des slides où petit à petit, les couches et les tranches se mélangent) ne crée plus de valeur. La dynamique émotionnelle ? Elle a disparu depuis longtemps.
Leadership, Coopération et Engagement
Le Leadership est la capacité à faire faire à ses équipes ce qu’elles ne feraient pas spontanément. Basé sur la confiance, elle permet de soulever des montagnes. Pour cela il faut avoir une vision, et la faire partager à ses équipes. C’est le rôle du CEO, mais aussi du manager de proximité. S’il n’a aucune idée de la finalité et de la raison de son projet, il lui sera difficile de motiver ses troupes. Il suffit de donner des dates, des objectifs insurmontables (gagner la coupe du monde 2010) et de motiver ses troupes.
La coopération est à distinguer de la coordination et de la collaboration. La coordination ? Si elle est mauvaise j’ai mal au dos dit Yves Morieux. La collaboration ? C’est cette capacité pour des équipes qui s’entendent bien à travailler ensemble. La coopération est la capacité à réaliser un projet commun alors que nos objectifs ne sont pas les mêmes. C’est le lot des équipes dans les services informatiques.
L’engagement est finalement la valeur ajoutée dans l’exécution. C’est aussi la capacité à s’adapter au système et à ne pas suivre bêtement les règles. Pour expliquer cela, Yves Morieux explique qu’aucun avion ne pourrait décoller si les contrôleurs appliquaient à la lettre les règles du contrôle aérien. C’est grâce à notre engagement et notre capacité d’adaptation que nous pouvons travailler ensemble.
La coopération fait mal à la tête car elle marche avec des compromis. Ce soir vous voulez regarder la demie finale de la coupe du monde alors que votre épouse veut regarder l’Amour est dans le pré. Si vous décidez de regarder tout le match, ce n’est pas de la coopération et il faudra en subir les conséquences. Vous allez donc ajuster votre variable, ce que l’on appelle le coût d’ajustement, pour que votre épouse soit contente, sans louper un but de l’Espagne.
Or il s’avère que l’on peut tracer une courbe de corrélation entre la Coopération sur l’axe horizontal, et les Ressources disponibles sur l’axe vertical. Plus vous avez de ressources, moins vous devez coopérer.

Pour revenir à notre problème de télévision, vous aurez deviné qu’il suffit d’acheter une deuxième télé, et tout le monde sera content.
Ce qui est intéressant pour revenir au salarié, c’est ce qui se passe lorsqu’il y a un manque de Coopération. Le problème de la coopération c’est qu’elle ne se mesure pas. Pour illustrer cela, Yves Morieux nous remontre la vidéo des Françaises lors du Championnat du monde de 2003. Il s’agit du 400x100m féminin. A l’époque les américaines étaient les meilleures au niveau des temps individuels. Et pourtant ce jour là … la Coopération a plutôt bien march

Mardi 6 juillet, 19h30, 211 Geeks, 2h de conférence, 30mn de buffet, une présentation sur Java EE 6, un speaker très bon, voilà comment résumer rapidement la soirée d’hier soir. La vidéo de la session sera sur Parleys.com cet été, je vous tiendrai au courant.
Adam Bien est consultant indépendant, Java Champion, auteur de plusieurs livres en anglais et en allemand sur Java. Il a carte blanche ce soir pour présenter Java EE 6 par la pratique. La présentation s’est découpée en 2 parties. Pendant la première heure, nous avons plus parlé conception et architecture. La deuxième heure fut une démonstration de programmation en direct. Les quelques 200 geeks présents ont bien apprécie et le message est passé.
Java EE 6 est plus simple, plus rapide, plus facile à apprendre et plus productif que Java EE 5. Si votre entreprise utilise encore Java J2EE 1.4, il est temps de regarder la dernière version. Dites bye-bye aux nombreux fichiers de configuration XML, le framework est vraiment bien pensé.
Avant que quelqu’un ne pose la question, il parle de Spring vs JEE 6. Spring offre plus de configurations, le framework est vraiment très configurable. Java EE 6 utilise plutôt des conventions afin de ne pas avoir à tout déclarer. Le conteneur EJB est vraiment petit. Moins d’1Mb. Il nous montrera par la suite que Glassfish v3 est vraiment véloce, dès lors qu’il s’agit de déployer une application.
Nous attaquons enfin le cÅ“ur du sujet, discussion qui va faire mal aux yeux pour certains architectes, pour mon plus grand plaisir. Adam Bien parle tout d’abord du pattern d’architecture « Boundary/Control/Entity » et de son application dans l’architecture des futures applications JEE 6. C’est un pattern similaire au pattern MVC, avec cependant une approche plus adaptée aux applications webs.
Il encourage une nouvelle approche basée sur la philosophie D.D.D (Domain Driven Design), où l’Entité n’est plus agnostique, où les Data Access Objects ne sont pas utiles. En clair : plus de DAO. Comme il va l’expliquer ensuite, vous avez beau mettre des couches et des couches, cela ne bloque pas pour autant l’évolution.
L’approche DDD (voir le compte-rendu de la formation de Zenika) met au premier plan le Domaine. Les Entités deviennent plus importantes que les Services. L’approche de ces dernières années, avec service/domain/dao est ce que l’on appelle l’approche orientée service. C’est une approche pratique pour les clients légers, pas forcément pour les applications webs. L’approche DDD fait que vos Entités portent des méthodes métiers. Le DAO de votre système est l’Entity Manager, qui se retrouve injecté dans votre Entity ou sinon simplement dans votre service.
Ce principe fait que les services, et les contrôleurs dans le Web, perdent la logique de l’application. L’architecture avec état permet alors d’adresser d’autres problèmes plus simplement qu’avec l’approche classique orientée service.
J’aime beaucoup ce concept. C’est l’approche de Play! Framework et je constate avec plaisir que c’est donc un mouvement qui peut aussi s’appliquer rapidement avec Java EE 6.
Les architectures classiques appelées « Service Driven Architecture » sont ce que nous faisons tous plus ou moins. Une couche de domaine, une couche DAO, une couche Service. Les Entities du domaine sont anémiques et ne sont que le reflet de la base de données. Les DAO ne servent souvent pas à grand chose. Les NamedQueries qu’ils portent pourraient être placées sur les Entités comme dans l’approche DDD. C’est une manière de programmer assez procédurale. Les Services sont les responsables de la logique de l’application. Cela marche bien si vous devez faire des Web Services et du SOAP, ou des architectures sans état. Mais cela vous demandera plus de code.
Adam parle ensuite des Interfaces et commence à nous montrer notre premier Bean Java EE 6 :
@Stateless
public class SimpleSample {
public void doSomething() {
}
}
Voilà c’est tout. Pas de XML de configuration et pas d’interface. Adam décourage l’usage des Interfaces si vous n’avez pas de réelles motivations architecturales. Les gens continuent à penser qu’il faut des interfaces pour que le code soit testable. C’est faux et cela fait 5 ans que l’on vous le dit. Allez lire cet article sur Mockito pour comprendre. Il est tout à fait possible de mocker des classes, c’est très simple. Donc définir une interface pour les tests : pas une bonne pratique. Par contre définir une interface pour structurer son application : oui si cela vous permet d’utiliser des choses comme le Strategic Pattern par exemple. Même pour les interceptors et les dynamiques proxies : Java EE 6 est capable de se baser sur les annotations et de gérer vos Beans très simplement.
Nous passons en revue les différents Beans de Java EE 6, les Entities, les Interceptors et même les Cron. Tout est relativement simple, et permettra d’écrire des applications rapides et puissantes. Investir en 2010 dans un livre sur Java EE 6 me semble une bonne idée pour les architectes et les développeurs. Vivement que nous puissions en faire dans nos projets. Cela fera des économies et redonnera du plaisir à utiliser Java EE en général.
En résumé pour cette première partie, Adam nous a montré qu’il est intéressant d’apprendre une nouvelle manière de construire une application d’entreprise, en se basant sur l’approche DDD plutôt que l’approche SOA. J’ai vraiment bien aimé cette partie, c’est une approche qui renforce la simplicité. Je pense qu’il va y avoir de longs articles pour montrer cette nouvelle approche. C’est très religieux, et proposer une nouvelle approche ne se fera pas sans grands débats enflammés, jusqu’à ce que tout le monde se rende compte qu’il avait raison.
A la pause, nous avons discuté autour du buffet. La remise en question de la tartine « domain/dao/service » ne va pas forcément convenir à tout le monde. Comme le dit Adam, ce n’est pas une mauvaise pratique. C’est une pratique qui n’est pas adaptée à tous les problèmes. Lorsque votre domaine est assez riche, il est plus facile de prendre l’approche DDD. Ce n’est pas plus compliqué, cela demande une petite remise en question de nos connaissances. Mais après tout, on apprend en permanence non ?
Après le buffet, nous avons eu une bonne heure de démonstration de Java EE 6. Avec des exemples de code, il a démontré qu’il était pratique et simple de travailler en 2010 avec Java EE 6 et Glassfish. Pour cela, il conseille d’utiliser NetBeans 6.9.
Pour terminer, je pense qu’il faut que je bosse sur un article afin de vous montrer les similarités d’approche entre Java EE 6 et Play! Framework. Si à terme un standard comme Java EE 6 me permet de coder de la même manière qu’avec Play! alors je serai le plus heureux des développeurs. Et même si j’adore Play!, je serai encore plus heureux d’utiliser un standard pour ma partie serveur, avec cette nouvelle approche plus simple.
Adam Bien sera ce vendredi dans le sud à la conférence SophiaConf 2010 organisée par l’équipe du Riviera JUG de Sophia-Antipolis. Ne manquez pas sa présentation !
Rendez-vous à la rentrée pour le Paris Java User Group, passez de bonnes vacances. Merci à José Paumard pour les excellentes photos.


Crédit photo : Jonathan W, licence Commons Creative 2.0
Olivier Hascoat taille un portrait très juste en 20 minutes des bides d’Internet afin de proposer des solutions aux Boss. Sur le thème « Durable », cette présentation nous fait réfléchir sur la place des entreprises qui lancent des projets Internet.
Olivier est l’ancien DG de MySpace, qu’il a quitté en septembre 2009. Consultant indépendant, son parcours dans différentes entreprises se transforme en un témoignage très juste de ces dernières années. Les entreprises s’abreuvent de stratégie de croyance par l’innovation. Très intéressant car cela entraîne la toute puissance de la vision du Chef, abreuvé par des articles et par ses diners en ville, qu’il faut bien faire réaliser ensuite. Et la cellule de Dèv a parfois toutes les peines à réaliser la dernière idée « géniale » du patron. Cela marche dans l’autre sens. Combien de projets hyper-techniques sans réelles débouchées ?
Les grands groupes ont racheté les services Internets, peut-être persuadés trop vite de faire une bonne affaire. Malgré la crise de la bulle Internet, la débauche a continué dans une moindre mesure.
Olivier Hascoat présente 4 points importants :
1) un constat d’échec pour certains projets dans un silence assourdissant
2) une exécution médiocre pour certains projets alors que l’idée est bien
3) des CEO avec un état-major trop éloigné du terrain
4) le web 2.0 et le retour de l’artisan développeur
Un slide résume assez bien la situation de quelques perles d’Internet. Qui se rappelle de Napster ? Vizzavi ? Flip ? ZeBank ? Go.com ? GetMusic ? Boo.com le site qui a brulé 100 millions de dollars pour vendre des vêtements ou encore de MovieLink ?
Ces projets étaient poussés parfois par l’état major des grandes entreprises des médias, qui n’avaient pas forcément la culture ou les équipes adéquates pour la réalisation de ces projets. Finalement ceux qui ont réussi ne viennent pas des grands groupes médias. Facebook ? une initiative d’un étudiant. Google ? 2 étudiants de Stanford… Les entreprises qui ont réussi sur Internet ne sont pas des projets issus des grandes entreprises de la communication.
Ce qui coince aussi sur ces projets, c’est la réalisation. Il y a eu beaucoup de sites lancés rapidement… qui ne marchaient même pas. Olivier se demande si les patrons de ces projets ont même essayé de s’en servir vraiment, tellement certaines erreurs étaient flagrantes. Saviez-vous qu’au contraire Steve Jobs teste beaucoup de ses produits et qu’il peut tout arrêter si cela ne lui plaît pas ?
Souvent les détails sont mal maîtrisés. Les fonctions de bases ne sont pas bien codées, c’est une catastrophe. Nous voyons sur les slides l’exemple d’un site sur mobile assez catastrophique… ce qui fait bien rire la salle.
Olivier raconte aussi le cas de projets très mal ficelés. Il raconte l’histoire d’un site de location de vidéos en ligne, qui avait juste oublié de regarder le catalogue proposé les majors. Le service a été lancé… avec 300 films nanards refilés par la major qui ne voulait pas « se risquer ». Inutile de dire que le site s’est planté quelques semaines plus tard.
Olivier parle ensuite de la pyramide d’Henry Mintzberg (note pour François : celui-ci ferait un très bon speaker pour 2011)
Le CEO doit porter la vision, une équipe doit porter le savoir et l’analyse, et une équipe le savoir-faire/la réalisation. Combien d’entreprises de l’ère Web 2.0 ne savent pas faire ? Combien d’entreprises n’ont pas de CEO visionnaire ? Il suffit de regarder un chiffre cinglant : 40% des 100 plus grosses entreprises sont dirigées par des anciens CFO (directeur financier).
Certaines entreprises ont passé trop de temps dans l’analyse. Cela se transforme en études, en business plans, en réunion de pré-lancement, en étude de marchés, en tout un tas de choses qui ne font pas avancer le problème.
D’autres entreprises ont tellement de visions, qu’elles communiquent à outrance. C’est un communiqué de presse où les mots « révolutionnaires » et « innovants » sont répétés à en vomir. C’est aussi une entreprise qui va célébrer avec une grosse soirée le « lancement de son site Internet » en faisant venir des Peoples, alors que le site n’a pas encore fait ses preuves. Pourquoi les entreprises ne gardent pas cet argent pour fêter les deux ans de leur projet ?
Si c’est le savoir-faire qui pêche, on verra un Boss incapable de se servir du site dont il aurait eu l’idée… des sites réalisés par des stagiaires et des juniors, incapables d’avoir le recul suffisant pour se rendre compte d’erreurs de débutants. C’est les services Internet lancés par des enfants gâtés qui ne veulent pas payer un développeur. Alors on prend des stagiaires et des petites mains…
Et vous vous étonnez de vous planter ? Mais c’est normal mon ami. Si l’informatique était facile, ma mère serait informaticienne (ça c’est de moi… désolé Olivier)
Les solutions sont ensuite exposées, mais un peu rapidement. Tout d’abord faite rédiger une lettre de mission, un réel manifeste qui doit guider votre entreprise. Par exemple : « Un site d’offres d’emplois pour les passionnés, où les annonceurs rédigent des mini-articles de blogs. Un site où les candidats expliquent simplement ce qu’ils veulent, pour que chacun puisse travailler ensemble »
Olivier conseille aussi aux CEO de prendre le temps de tester très souvent ce que réalisent les équipes. Si tu es CEO, et que tu n’as pas à tout moment une URL pour tester, tu vas dans le mur. Si tu ne sais pas ce qu’est une URL, change de métier. Retourne faire du PowerPoint chez McKissé.
Focalisez vous sur les services clés de votre plateforme. Ne perdez pas de temps à coder des parties annexes. Identifiez ce qui fait que votre idée est différente. Soyez capable de présenter votre projet comme le fait Steve Jobs. Et pour la réalisation, pensez à prendre de bons artisans, à avoir un management durable, sur le long terme.
Conclusion
Une bonne présentation à tremper dans son café vers 10h00 du matin. J’ai beaucoup aimé les idées présentées avec un oeil très marketing/HEC’cien. Idées qui se seraient complétées avec un oeil de Geek sans problèmes.
Allez je continue… le billet suivant sera la KeyNote d’Yves Morieux du Boston Consulting Group… un truc bien décapant.
Ressources:
- la bourde de Vizzavi lors du lancement du site : des milliers d’euros pour racheter le nom de domaine
- l’histoire de Ze Bank 130 000 clients, 255 millions cramés
- Le cimetière des Startups sur Presse-Citron.
- Rigolons sur CNet.com avec les plus beaux plantages de l’Internet
La séance de juillet du Paris JUG a eu pour thème "Lightweight Killer Apps with Nothing But Vanilla Java EE 6". Elle était présentée par Adam Bien et a occupé les deux créneaux horaires (19h30 à 22h00).
Le buffet était offert par François Ostyn.
Une soirée bien intéressante, qui l'a redonné envie de jouer avec Java EE 6, malgré son passif technologique assez lourd. Je vous laisse lire le compte-rendu intégral :
var wavePanel = new WavePanel({rootUrl:'http://wave.google.com/wave/', bgcolor:"#FFF"}); wavePanel.loadWave('googlewave.com!w+SpsT3UEJA'); wavePanel.init(document.getElementById('waveframe'));... Lire Paris JUG "Java EE 6" par Adam Bien

La première journée de l’USI débute par une présentation de 20 minutes, après une Keynote d’ouverture passionnante de Chris Anderson. Serge Soudoplatoff, professeur à l’HETIC et à l’ESCP, propose une prise de conscience intéressante sur l’impact d’Internet dans l’entreprise.
L’histoire d’Internet tout d’abord est intéressante. C’est une innovation qui a émergé d’un projet inter-université, et pas d’une demande du D.O.D comme on l’explique parfois. Initié pour relier des universités qui travaillaient avec le DARPA, ce projet donnera naissance à ARPANET (voir l’article complet de Wikipedia) en 1969. Ce qui est intéressant dans cette histoire, c’est que les gens en ont changé l’utilisation initiale. Un jour les chercheurs décident de changer légèrement l’utilisation pour pouvoir s’envoyer des messages, les prémices de l’email. Le réseau Internet est né comme cela. Serge explique que l’innovation est apparue par percolation. Pour 100 idées, 40 passent le test de l’utilisation, puis 3, puis finalement une seule. L’envoi par paquet dès 1968 permet ainsi de résoudre le problème de fiabilité des connexions. Le Français Louis Pouzin invente le protocole X50 lors de la mise en place du réseau Cyclade destiné à connecté les centres de recherches Français. La liaison était à 4kb/sec à l’époque, l’ancêtre de Transpac.
Telnet, ftp, tcp ont été spécifié entre 1970 et 1972 (voir ici ce cours de Polytechnique) mais finalement le WWW, l’Internet tel que nous le connaissons a été lancé en 1989 par Tim Bernes-Lee au CERN.
Pour revenir à la présentation, prenons le temps de regarder Internet comme un projet, et de le comparer à un projet informatique dans une entreprise. Nous voyons tout d’abord que c’est un projet sans hiérarchie, sans chef de projet, sans MOA et sans notion de R.O.I. C’est un projet où tout ce qui marche fait ses preuves en existant, sans forcément un plan produit derrière. Internet ce sont des bouts de codes qui marchent. Celui qui pense à une idée c’est celui qui la réalise, c’est d’abord un réseau de passionnés. Imaginons un instant le développement d’un projet informatique sur ce mode… il aurait peu de chances de passer à travers les griffes de la direction financière ou du marketing, au premier abord.
En 1969 il y a 4 ordinateurs connectés. En 1990 la sortie du HTML remet le mode client-serveur au premier plan, alors que la tendance jusque là était simplement d’échanger des informations entre sites. Y aviez-vous déjà pensé ?
1993 c’est 2 millions d’ordinateurs (l’année de mon Bac). Aujourd’hui on estime à 700 millions le nombre d’ordinateurs connectés. Google détient 2 millions de machines, Facebook environ 60 000. Il existerait 250 000 de sites Webs. En 18 ans, Internet a connecté 1.8 milliards d’individus sur la Terre. Lorsque l’on pense à l’invention de l’imprimerie, du téléphone, ou de la télévision, on comprend alors l’importance d’Internet et donc de ses effets sur notre civilisation.
Serge parle maintenant de la communauté. Internet dès le départ a donné la possibilité de se connecter, de créer une culture d’entreprise. Regardez l’essort des blogs, des wikis, des forums ou de Twitter. En 1994 lorsqu’Intel sort un Pentium 66Mhz bogué, cela aurait pu passer inaperçu. Un message déposé dans un newsgroups public va déclencher en quelques semaines une vague de protestation. Maintenant, tout le monde sait, je dois faire quelque chose se dit Intel. Et suivra une vague de rappel énorme. Tout ceci parce qu’un jour un comptable constate une erreur dans une feuille Excel de calcul…
Aujourd’hui avec Twitter, il ne faudrait que quelques heures pour faire tourner l’information. Les constructeurs savent que les gens peuvent savoir. Serge dit : « Everybody knows that everybody knows ».
Appliqué à l’entreprise c’est vrai. Pour peu qu’un manager indélicat fasse une boulette, il est presque certain que tout le monde dans l’entreprise sera au courant très vite. L’aire du cloisonnement de l’information par la Hiérarchie a du plomb dans l’aile.
Le deuxième point dont il souhaite nous parler est l’essors de l’économie de l’immatériel. Regardez par exemple un site comme « Sell a Band » ou aussi « My Major Company« . Vous pouvez devenir producteur de musique en quelques clics. Internet permet de réaliser des projets et de changer l’économie établie jusqu’à maintenant, pour le plus grand bien des artistes finalement. Il parle aussi de ces sites où vous pouvez acheter des épées et des armures pour World of Warcraft. En Asie, des gens font ce que l’on appelle du « farming« . Ils passent leurs journées à effectuer des actions dans des jeux en ligne afin d’accumuler des biens virtuels (épées, munitions, potions) pour les revendre ensuite sur eBay dans le monde réel, et donc pour générer de l’argent avec ce temps passé. Et c’est rentable !
Un bien matériel comme un CD de musique ne se divise pas. Un bien immatériel comme un MP3 se multiplie, et nous permet de consommer la musique dans notre salon, notre voiture et les transports. Fabrice Epelboin à propos d’Hadopi a écrit une phrase que je trouve assez pertinente. Un iPod 16Go d’Apple permet de stocker 4000 chansons Mp3 environ. Si la chanson coûte 1 EUR, il faudrait donc payer 4000 EUR pour remplir son iPod. Quel adolescent peut nous faire croire qu’il dispose de ce budget ? S’il n’était pas possible de sauver sur son ordinateur ces musiques, la perte d’un iPod complet représenterait une perte de 4000 EUR… A méditer.
Ce qui est donc important c’est de reconnaître l’importance de l’immatériel. Les entreprises doivent maintenant apprendre à identifier ce capital immatériel (qui ne fait pas partie des immobilisations) car il existe certainement.
Le 3eme point dont il souhaite nous parler est la place du consommateur par rapport à l’entreprise. Aujourd’hui l’Internaute peut se faire construire SA paire de chaussure, ou se faire imprimer SON teeshirt, son tableau, sa photo, ses stickers, ses décorations pour sa planche de surf… Nous pouvons grâce à Internet réaliser une hyper-personnalisation qui serait ruineuse dans l’économie réelle, avec un magasin.
Serge montre l’exemple de Dell qui a ouvert un espace sur son site afin que les Internautes donnent leur avis. Et cela marche, puisque les remarques sont prises en compte. A une autre échelle, lorsque j’ai codé le site express-board.fr, je l’ai fait avec la communauté. Ma page Google Moderator a reçu 27 idées de la part de 48 personnes.
Au lieu de faire une étude de marché, lancez un espace sur votre site pour que la communauté s’exprime et vous propose des idées. Cela ne coûte pas cher et permet de trouver des pépites. Et surtout cela permet de développer le site qui plaît aux gens. Lisez mes échanges avec la communauté sur la page « spécial Beta » pour comprendre.
Il montre ensuite l’exemple du site FreeBeer. Organisé par des étudiants Danois, ce site vise à montrer que l’on peut faire de la bière « open-source » en laissant la recette librement accessible sur Internet, en proposant une bière payante.
Dans les années 90, les ingénieurs développaient des « machins » très compliqués. On a donc inventé le Marketing pour vendre ces machins aux gens, en les persuadant qu’ils en avaient besoin. Par exemple le BlueRay ou les écrans 3D, alors que le film Avatar n’est pas en 3D pour l’instant (et oui…). Les temps changent, et l’entreprise va devoir apprendre que les Internautes veulent être au centre de la démarche client. Pas en bout de chaîne.
Il parle ensuite de l’expertise d’usage des clients. Cela permet de développer des forums d’assistances où finalement les meilleurs conseillers ne sont pas une équipe de bras cassés dans un centre offshore, mais des utilisateurs finaux. Ils allouent de leur temps pour répondre. Regardez le succès des sites d’assistance des opérateurs ADSL en France par exemple.
Pour conclure, force est de constater que les frontières entre l’entreprise et ses clients sont de plus en plus floues, de plus en plus poreuses. Le client peut donner un avis sur votre service sur Internet. Vos concurrents peuvent lancer le même service, plus rapidement, moins cher. Les gens peuvent se regrouper très rapidement pour s’opposer à votre communication. Regardons ce qui arrive dans le Golf du Mexique en ce moment, je crois qu’un certain pétrolier va avoir des soucis à se faire.
Plus proche de nous, la communauté a empêché le passage de la première loi Internet Hadopi. Les lois suivantes seront regardés deux fois plus… Vouloir contrôler Internet est un rêve d’Enarque, qui ne sait même pas se servir d’un iPhone ou d’un BlackBerry.
Conclusion
Très bonne présentation qui aurait méritée un slot de 40 minutes je pense. Peut-être une Keynote l’an prochain ? Je vous avoue qu’il a été très dur pour moi de prendre des notes et de suivre la présentation. Je m’excuse par avance auprès de Serge Soudoplatoff si j’ai déformé ou mal interpreté ses propos. Mais je pense que le fond est là .
Je vous recommande la lecture du blog de Serge Soudoplatoff pour la qualité de ses articles.
Mardi dernier, j'ai animé chez Zenika une conférence sur les Annotations. Et le sujet est plus complexe qu'il n'y paraît. Outre les subtilités de leur syntaxe, les annotations disposent d'un outillage puissant à la compilation et au runtime, dont la maîtrise ouvre de nouvelles perspectives en termes de méta-programmation. En particulier, j'ai... Lire Conférence : Les annotations enfin expliquées simplement
C’est parti, l’USI 2010 la conférence des Geeks et des Boss commence ce jeudi matin par une Keynote d’une heure de Chris Anderson. Rédacteur en chef du magazine Wired, c’est l’inventeur de l’expression « The Long Tail » traduit en Français par « la Longue Traîne« . Avec 32 927 followers sur Twitter, cela vous donne une idée de l’importance du bonhomme dans la communauté Web.

Crédit photo : USI 2010 OCTO Technology
Il souhaite nous proposer quelques idées et aussi nous parler d’idées de ces dernières années qui ne se sont pas réalisées. Petit retour pour commencer aux années 1960. Une slide montre une équipe d’ingénieurs enthousiastes, habillés comme dans un épisode de Star-Trek. Il s’agit de l’inauguration d’une centrale nucléaire dans les années 60. La promesse d’une énergie inépuisable… sans penser aux problèmes des déchets radioactifs. Le World Trade Center avait été imaginé sans interrupteur électrique. Les architectes pensaient que la lumière serait toujours allumé la nuit, car à l’époque on pensait que l’électricité serait un jour gratuite…
En fait il y a bien certaines choses qui sont tellement peu cher, qu’il devient inutile de les mesurer. Chris présente 3 de ces technologies :
- Processing
- Storage
- Bandwidth
La puissance de calcul (Processing) explose et ne coûte pas plus cher. Regardez l’écart entre votre premier ordinateur et celui que vous avez aujourd’hui. S’il y a un secteur où à prix constant, la valeur représentée par la puissance a augmenté, c’est bien la puissance de calcul. Demain cette puissance permettra à chacun d’avoir accès à des grilles de calcul pour rien… Le lendemain, Juan Enriquez nous montrera un super calculateur de 1991 et la photo de 2 processeurs d’Intel de 2010. Les 2 processeurs ont plus de puissance que ce super-calculateur, qui avait dépassé le téraflop… En 19 ans nous avons la puissance d’un super-calculateur dans notre salon, dans notre PS3 par exemple.
Deuxième thème : le stockage (Storage). Au moment où il prononce ce mot, blackout total, les plombs sautent. Je vous assure, ce n’est pas une blague. Le temps de relancer en quelques minutes les machines, et la conférence repart. Il parle d’une notion dont j’ai peu entendu jusqu’à maintenant. Le souci n’est pas le stockage. On observe que l’espace de stockage sur Internet est plus important que l’espace de son ordinateur. Il raconte (et je m’en suis inspiré dans cet article) que son entreprise avait des quotas d’emails en 2004, ce qui était impossible pour lui. Et rapidement ils ont basculé vers GMail qui était en béta à l’époque. Il montre ce slide de 2007 où Yahoo! Mail annonce que le quota de stockage est illimité, chose que je ne savais pas. Mais GMail a conservé son avance, et c’était trop tard pour Yahoo!.
3e Technologie qui est « to cheap to meter » d’après son expression : la bande passante. Le fait que la Bande Passante ait explosé ces dernières années, avec l’apparition de l’ADSL, permet aujourd’hui de consommer la bande passante toute la journée, sans faire payer le volume transféré. Chris raconte que lorsqu’il a voulu montrer Star Wars à son fils de 9 ans, celui-ci a préféré regarder la version Lego Star Wars plutôt que le hit des années 80 (il a 5 enfants). Le fait que la Bande Passante soit peu cher permet d’offrir des vidéos comme sur YouTube ou DailyMotion. Et il devient possible de faire n’importe quoi comme regarder des vidéos de Legos sur YouTube, car cela ne coûte rien. Moi j’aime bien.
Son message est le suivant : le très peu cher permet de proposer de nouveaux services et montre l’apparition de nouveaux phénomènes de consommation (sa fameuse Long Tail).
Il nous parle de l’étude de WallMart qui visait à comprendre pourquoi les gens achetaient souvent un mixeur blanc dans les rayons de leurs supermarchés, alors que sur Internet les couleurs changent tout le temps. L’hiver dernier, c’était le Mixeur Prune qui se vendait le plus. Trois semaines plus tard c’est le rouge… et en ce moment le noir. Tout d’abord le site Internet propose toutes les couleurs là où les vrais magasins ne peuvent proposer que les couleurs qui se vendent le plus. Or les utilisateurs finalement changent d’avis assez rapidement. Il suffit d’une émission de cuisine un matin, où le présentateur utilise un mixeur vert pomme, pour que les ventes explosent…
Ce qu’il faut retenir c’est que les sites Internet peuvent proposer un choix bien plus large que les magasins traditionnels. Pour l’exemple des CD par exemple, ceci permet à tout le monde de trouver son rayon virtuel et de faire ses achats.
Il raconte aussi l’exemple du site Veganchic.com qui vend des chaussures et des sacs « vegetables ». Il s’agit de chaussures faites sans aucune partie animale. Pas de cuir donc. On appelle cela des « Animals Free choose ». Ce type de magasin en vrai aurait toutes les difficultés du monde pour être rentable, alors que sur Internet c’est envisageable.
Il revient maintenant vers l’entreprise pour terminer. L’opposition entre ce qu’il appelle « Scare-city » où tout est compliqué et « Abondance city » où tout est facile devient flagrante.
Votre boite email ne fait que 100Mb ? Vous vivez à Scare-City. Par contre votre employeur utilise Google Apps ? Bienvenue à « Abondance city ».
Un DSI veut un ROI et des mémois avant d’investir ? ScareCity. Vos Geeks lancent le développement et travaillent sur un prototype avec les gens du métier ? Abondance City.
Vous achetez un logiciel propriétaire ? ScareCity !
Vous prenez une solution open-source… Abondance City.
Il rêve d’une entreprise où les employés seraient autonomes, responsables et responsabilisés. Où les gens seraient évalués sur leur contribution collective plutôt qu’un objectif individuel. Comment entreprendre en étant individuel ? Il termine par nous montrer une image de son ordinateur et de deux cables réseaux posés à côté. Le cable noir, c’est le réseau contrôlé et fermé de son entreprise. Il ne s’en sert que pour faire ses notes de frais. Le cable blanc c’est Internet, le même qu’à la maison.
Conclusion et ce que j’ai appris
Doux rêve ou réalité de demain ?
Les responsables dans nos entreprises comprennent-ils le changement ? J’ai envie de faire mon petit marketeur/sociologue et de lancer un nouveau buzzword : la Génération G (pour Google/Geek) arrive dans l’entreprise, et elle n’est pas prête à utiliser votre câble réseau noir.

Ce témoignage purement fictif est tiré d’une discussion à l’USI 2010. Christophe travaille pour la société de service BeeBee. Il est en mission en ce moment à Nouest, dans le sud de la France, au siège d’un grand assureur. Il travaille dans cette mission depuis 3 semaines. En dehors de cela, c’est un vrai Geek. Ordinateur portable, iPad, iPhone, il a la panoplie complète du Geek passionné et connecté. En arrivant dans cette nouvelle mission, il va découvrir qu’il existe un fossé entre les outils de communication de son entreprise et sa vie d’internaute… Voici ce qu’il m’a raconté.
Les premiers jours j’ai dû découvrir l’utilisation d’un client de messagerie. C’est un logiciel que je n’ai jamais utilisé. Lorsque je faisais mes études nous utilisions Google Apps. Pour moi l’email c’est une page Web, pas un logiciel comme Lotus Notes. Rien que ce nom de papier toilette aurait dû m’avertir sur ce qui m’attendait. Enfin bref, je m’y suis mis car c’est un outil indispensable pour travailler semble-t-il…
L’espace alloué aux emails est ridicule : 100Mb. Je ne suis là que depuis quelques jours, mais déjà je me rends compte que ma boite aux lettres sera pleine rapidement si je ne la vide pas. Le service informatique m’a donné un document Word de 9Mo dans ma boite email le premier jour. Le document explique comment effacer et trier ses vieux messages. En fait je n’ai donc que 91Mb. Je regarde le panneau « Information » du document Word et je découvre qu’il a été écrit par un consultant de McQuiCé. J’ai une pensée émue pour le DSI qui a certainement fait réaliser un audit pour résoudre ce problème d’espace disque… Au prix du jour/homme d’un consultant de McQuiCé, cela fait cher la page. Bref passons.
Je mets en place des filtres pour trier les courriers électroniques. A titre personnel, je n’utilise plus beaucoup l’email. Entre Facebook et Twitter, je communique différemment. Or là , il semble que l’email soit une chose très importante dans le fonctionnement de cet assureur. Nous recevons beaucoup de CG pour « communication de groupes » dont je n’ai que faire, étant prestataire de service. Mais il paraît que c’est compliqué de ne pas mettre les « prestas » dans l’alias groupe… alors nous subissons l’avalanche d’annonces inintéressantes. Par exemple ce matin j’ai un message du C.E qui vous vend ce midi des superbes bijoux en résine véritable plastique. 15 EUR le collier, 1 EUR est reversé à une association (et donc 13 EUR au vendeur et 1 EUR au fabricant chinois). Je n’en n’ai rien à faire. Mais bon…
Mon responsable commercial veut m’envoyer un modèle de spécification technique ce matin. Je dois avancer sur cette partie rapidement. Vous allez voir que cela va m’occuper une bonne partie de la journée. Il y a 2 obstacles entre mon responsable commercial et ma boite Lotus Notes : tout d’abord il faut que son document ne dépasse pas 5Mb, sinon la passerelle de l’entreprise rejettera son courrier. Ensuite, et là j’ai vraiment halluciné, il faut que l’adresse email de l’expéditeur soit reconnu par le système. Sinon le courrier est classé comme Spam, et je ne le recevrai jamais.
Il faut qu’il envoie un email, la passerelle retourne alors un message lui demandant de cliquer sur un lien s’il est bien humain, puis laisse ensuite passer son message… C’est dingue non ? Pour envoyer son email la première fois, il a fallut qu’il se fasse reconnaître.
Ensuite ne voyant toujours pas le document arriver, j’ai pris le téléphone pour appeler l’extérieur. Impossible de numéroter, la voix de synthèse me dit « opération non permise ». A priori mon poste téléphonique n’a pas le droit d’appeler l’extérieur… Bref je l’appelle avec mon iPhone. 10 minutes de manipulation plus tard, il m’expédie 2 documents pour passer sous la barre des 5 Mb de la passerelle email. Youpi il est 11h40 et je peux enfin commencer à travailler.
En fait non. Mauvaise version de Word. Notre version est trop ancienne pour ouvrir le document… (soupir)
Après avoir demandé un nouvel export, je peux enfin commencer à travailler. Je dois décrire l’architecture d’une application de gestion, basée sur entre autre sur Spring. Afin de compléter mon document je souhaite aller sur les forums de SpringSource pour compléter mes recherches. Je tappe donc « forums.springsource.com » dans la barre du navigateur Internet Explorer 6.0 développé en 1991, un bon navigateur bien pourri qui a 9 ans…
Et là c’est le drame.
Une page d’erreur affiche « Ce site n’est pas autorisé par le service de gestion de l’accès internet ». Je pousse un nouveau soupir… Si au moins ils avaient utilisé une police d’affichage comme sur les affiches russes de 1953, avec une image de gentil soldat entrain de défiler, un fond rouge, des gars avec des tenues Mao… Un truc sympa quoi… Mais là non, rien du tout.
Il y a une zone de texte où l’on peut mettre un code d’accès pour passer outre la sécurisation et charger le site. 5mn sur le Wiki et je trouve le code en question. J’accède donc finalement au forum pour pouvoir travailler. Un autre consultant me raconte que certains prestataires viennent avec leur ordinateur portable et se connectent via Wifi au réseau « Free Wifi ». Ne croyez pas que c’est pour aller sur Facebook ou autre. C’est vraiment pour travailler. En fait les gens en général ne vont pas sur les sites de X ou de sports, ils ont autre chose à faire. Et puis un site de X dans un open-space… ça semble stupide.
Ma journée avance bien. J’ai cependant perdu du temps car je n’ai que 2Mo de mémoire sur mon ordinateur, mais passons. , il ne me reste plus qu’à terminer ce soir car il me manque 2 logiciels Il me faut d’abord un logiciel de modélisation et ensuite Microsoft Visio pour faire un diagramme technique. Or le logiciel de modélisation n’a que 5 licences flottantes, et il arrive très souvent que les gens oublient de refermer celui-ci. Bref le logiciel n’est pas toujours disponible lorsque nous en avons besoin. Pour Visio ce n’est pas grave, je compte terminer ce soir de chez moi.
Il ne me reste plus qu’à mettre sur la clé USB mon document… car je ne peux pas envoyer de documents de plus de 5 Mb par email. Or croyez-moi, malgré les soucis de cette journée j’ai réussi à avancer et à faire un bon document plutôt complet. Bref je branche ma clé USB… qui n’est pas reconnue. En fait un logiciel bloque le port USB, et il est donc impossible d’introduire un logiciel dans le réseau… Me voilà bien embêté.
Je pars faire un break à la machine à café. En revenant, écran noir : « VOTRE DOCUMENT CONTIENT UN VIRUS. Il a été effacé. Votre numéro de poste a été envoyé au Service de Sécurité et de Surveillance de l’Utilisation du Réseau ».
Je viens de perdre mon travail.
Connard d’antivirus.
Le jour suivant j’ai demandé à mon ingénieur d’affaires de changer de mission.
Conclusion
En cherchant à se protéger, à standardiser et à réaliser des économies, nous prenons le risque d’avoir un système informatique totalitaire et obsolète. Il n’est pas exclu dans certaines entreprises que les employés cassent ces murs numériques. Il est donc important de s’assurer que les principes de précaution ne se transforment pas en principes très cons.

La deuxième journée de l’USI 2010 est consacrée à 2 thèmes : Ouvert et Valeur. La journée a débuté par une Keynote excellente de Neal Ford et de Martin Fowler. Je vous la réserve pour un article complet. Après un break, je suis allé écouter Olivier Mallassi du NoSQL User Group. Sa présentation nous propose de découvrir quelques choix d’architectures pour construire un système informatique stable, puissant et capable de récupérer en cas d’incidents. En cas de crash d’un système d’information, il est par exemple intéressant de prévoir des fonctionnements dégradés ou des routes de secours. J’ai enchainé par la présentation de Guillaume Plouin sur le Cloud Computing. Quelles applications concrètes pour votre système informatique ? Tout le monde n’est pas Google. Mais les idées des grands peuvent s’appliquer dans la construction des architectures. Présentation très sympa.
La claque de la matinée fut pour moi la présentation de Fabrice Epelboin, éditeur de la version française du blog ReadWriteWeb. Sans doute l’une des meilleurs présentations du format 20 mn de ces 2 jours. L’impression qu’un train vous passe dessus… Le sujet portait sur la liberté d’expression, la mise en place d’outils de contrôle, les risques que cela engendre. Les mots Hadopi, Lopsi et Deep Packet Inspection sont évoqués, avec les dérives qui arriveront un jour. J’ai le sentiment que nos gouvernants ne se rendent pas comptes du danger de ces lois.
Après une petite pause, nous repartons sur une Keynote de Jean-Philippe Courtois, DG International de Microsoft. Le message à retenir : Microsoft s’implique dans l’open-source, massivement dans le Cloud avec Office par exemple, mais aussi dans la communauté. La présentation a dérivé sur les brevets entre autre, je crois que c’est le moment où j’ai préféré sortir et aller prendre l’air. J’en ai profité pour interviewer Neal Ford et Martin Fowler, comme quoi ça valait le coup.
Pause déjeuner, l’occasion de rencontrer pleins de mondes. L’USI c’est par exemple un DG d’une Banque qui vient me voir et qui me demande quel est le plus vieux Geek que je connaisse. J’ai discuté avec Neal Ford et Martin Fowler, en compagnie de Didier Girard. Nous avons parlé de la position des « vieux geeks ». Neal du haut de ses 48 ans, explique que nous sommes une population qui n’existait pas en tant que telle il y a encore 20 ans. Il est confiant et la place de l’informaticien senior n’est pas un souci pour lui. Martin Fowler était un peu plus réservé, et nous avons parlé de la notion de Geek 2.0 (copyright D.Girard).
Une deuxième Keynote ensuite pour reprendre l’après-midi. Derrick de Kerckhove, sociologue, parle de l’aire du Tag. J’ai noté quelques points intéressants. Tout d’abord un slide qui explique que nous utilisons la parole pour communiquer depuis 17 000 générations. Cela fait « seulement » 300 générations que nous utilisons l’écriture, que 36 générations que nous utilisons l’imprimerie, et à peine 3 générations que nous utilisons le télégraphe. Internet n’existait pas du temps de mes grand-parents, j’ai connu le Minitel, et je me demande bien ce que découvrira mon fils… Intéressant non ? On se rend donc compte que les outils de communications vivent une révolution depuis 150 ans à peine. Cela a des impacts sur la société. D’après Derrick de Kerckhove, notre société va vivre maintenant l’étape du Cloud Computing. Notre vision de l’homme est encore orientée « imprimerie ». Le Web finalement n’est qu’un livre électronique non ? Je te dis cela à toi qui lis un blog… comme un livre. Nous n’avons pas encore vraiment changé notre mode de communication pour l’instant.
Il cite son maître, avec qui il a travaillé 10 ans au Canada, Marshall McLuhan. En 1962 déjà avait plus ou moins anticipé ce qui nous arrive aujourd’hui. Cette présentation orientée communication et sociologie était très intéressante.
C’est ensuite 4 présentations de 20mn, une Keynote d’une heure et le spectacle de Fabrice Luchini qui nous attend. A peine le temps de souffler.
Je reprends par la présentation pour Geek de Greg Young. Excellente, mais trop courte. Ce qu’il faut retenir : il est plus judicieux de modéliser 2 domaines différents lors de la construction d’une architecture informatique, afin de faire la distinction entre la lecture des données, et l’écriture des données. Greg nous présente un modèle qui enregistre les événements qui le change, plutôt qu’un modèle statique, mis à jour avec un update… Finalement, imaginez que vos Entities ne peuvent pas être modifié. Si le système conserve sous la forme d’événement les demandes de mise à jour (une sorte d’Hibernate Envers) alors tout d’un coup, votre système conserve une mémoire, un historique de son activité. Mine de rien, un repository SVN ou Git, c’est la même chose non ? Imaginez votre modèle non pas comme un modèle statique, mais plutôt comme un système versionné. Intéressant non ?
Je descends ensuite assister à l’excellente présentation de Guillaume Duquesnay : « Avalez la pilule rouge, recrachez la pilule bleue ». Il nous propose de prendre conscience des limites des outils de communications modernes comme l’email et la vidéo-conférence, afin de reconnaître des situations de ruptures et de changer de mode de communication. Prenez cet email de Jean-Pierre, qui écrit comme un chartier alors qu’en vrai, il est doux comme un agneau. Ou cette vidéo conférence, où vous êtes déconcentré par le passage d’une belle stagiaire dans le couloir… Dans les vidéo-conférences, Guillaume nous encourage à ouvrir une fenêtre de Chat pour marquer et partager les notes de la réunion. Pour les emails, ne mettez pas le nom de l’expéditeur tout de suite. Rédigez votre email, et si vous y passer 3 heures, c’est le signe qu’il faut laisser tomber et aller voir la personne. Très bonne présentation là aussi.
J’enchaine avec une présentation bien menée mais qui ne m’a pas accroché. Peut-être trop compliquée, et mal adaptée au format de 20 minutes ? Je vais vous la résumer rapidement. Antoine Gourevitch et Vanessa Lyon reviennent sur les strategies à mettre en place pour revoir le fonctionnement de la DSI. Ce que j’ai retenu : entre le métier d’une part, qui peut faire appel à des SaaS ou au Cloud Computing, et les fournisseurs externes de service d’autre part, la vie du DSI n’est pas facile. Risque-t-il de se transformer en « super acheteur » ? Choisir une plateforme de Cloud, un logiciel SaaS ou sélectionner une SSII… pas facile. Son travail est aussi de gérer les tensions entre le métier et la réalisation. Est-ce que l’on met ensemble les équipes ou pas ? Serait-il mieux de mettre ensemble les gens du métier, les développeur, les testeurs et l’exploitation ou pas ? Force est de constater que les entreprises préfèrent mettre en place des structures matricielles très compliquées… sans résoudre le problème. On essaye de mettre des architectures communes, des socles techniques communs, sans laisser la liberté de prendre une solution adaptée à chaque problème.
Je termine la journée par la présentation de Pierre Pezziardi, que j’avais déjà vu avec plaisir à la conférence Agile France en juin. Cela m’a donné envie de lire le livre de Pierre. Je ne sais pas si les participants ont eu ce livre gratuitement, mais pas les speakers. Je l’aurai bien lu, si vous voulez que j’en parle sur le Touilleur Express.
Nous terminons notre journée par une conférence hallucinante. Juan Enriquez est le CEO de la société Biotechonomy. C’est un business man visionnaire qui dirige une société de biotechnologie. Il a entre autre travaillé avec Craig Venter sur le séquencement du génome humain. Je vous détaillerai dans un autre article cette Keynote, qui fut énorme…
Enfin pour terminer, Fabrice Luchini est venu nous détendre pendant une heure. Avec le talent et la gouaille que l’on connait, il nous a bien fait rire.
Juste le temps de clôturer, et de se dire à l’année prochaine, l’USI c’est terminé.
Bilan
J’ai participé à beaucoup de présentations orientées Boss. L’USI est en fait l’unique occasion de prendre conscience de l’écosystème de la DSI, des tendances dans l’IT, et de la vision de notre monde globalement. Les Keynotes sont les clés du succès, avec la venue de speakers prestigieux. Certains jeunes Geeks sont surpris et étonnés de découvrir une autre échelle, qui remet en question notre vision parfois binaire de l’entreprise et du développement. Certains Boss sont étonnés de voir des conférences où le Cloud est très présent par exemple.
Je retiens cette année une prise de conscience collective sur la nécessité de changer l’entreprise. Le monde extérieur change (Derrick de Kerckhove), nous pouvons réussir des projets informatiques en travaillant différemment (Neal Ford et Martin Fowler), sommes-nous trop humain pour réussir ? (Ludovic Cinquin), la communication est la clé (Chris Anderson), la complexité est là (Yves Morieux) et il y a 700 millions de serveur internet dans le monde (Serge Soudoplatoff)…
A l’année prochaine, ça c’est sûr, vous pouvez compter sur moi.
Fin de la première journée de la conférence USI 2010 organisée par Octo Technology à Paris. En attendant de vous écrire plus de billets détaillés, je vous propose un résumé simple de la journée. L’USI c’est une conférence où l’on mélange les Boss et les Geeks. Avec 560 inscrits, chiffre donné par les organisateurs, et peut-être un peu moins, chiffre donné par les compteurs officiels du Touilleur Express, c’est déjà un succès sur le nombre. L’événement continue à grandir, et l’équipe d’organisation est irréprochable.
J’ai passé ma matinée à écouter des conférences orientées Boss. Les Keynotes sont particulièrement intéressantes. Chris Anderson du magazine Wired, Yves Morieux du BCG sur la complexité et la gestion des développements informatiques, Michael Ballé sur le Lean dans l’industrie, puis sa translation dans notre industrie… Les Keynotes valent le détour. C’est l’occasion d’écouter de très bons speakers. Forcément Boss pour cette première journée. Mais demain matin j’écouterai Neal Ford et Martin Fowler, donc je sais que les Keynotes de Geeks arrivent.
Les présentations ensuite pendant la journée se déroulent soit sur un format de 20 minutes, soit sur un format d’une heure. Finalement ces 20 mn c’est parfait. Les Speakers font passer le message, et tu peux ensuite changer de salle rapidement pour suivre les sessions les plus intéressantes. Il y a 3 salles, donc tu es obligé de faire un choix entre 3 sessions. J’ai entendu qu’Octo compte mettre en ligne rapidement les vidéos des sessions, ce qui veut dire que toi lecteur, tu pourras revoir celles-ci très bientôt. Je vous confirmerai cela demain.
L’après-midi débute avec l’enregistrement live du célèbre Podcast Java « Les CastCodeurs ». Il a d’ailleurs dépassé les 4300 téléchargements par mois. Quand je pense que les blagues de Guillaume sont écoutées 4300 fois… Mais ça fait son charme, continue Guillaume. Nous avons parlé de Java 7, des standards, du rachat de Sun Microsystems par Oracle, la salle a participé, c’était sympa.
Je suis ensuite allé écouter la présentation en 20mn sur le Lean d’Hervé Lourdin et Clément Rougier, puis ce fut à mon tour de monter sur scène. Tout s’est bien passé, et je vous raconterai sur le blog ce que j’ai raconté durant ces 20 minutes. Oui j’ai parlé de vous, de la communauté, des 322 personnes qui ont répondu au sondage en avril. J’ai parlé un peu aussi de l’express-board, du paris java user group, de tout ce qui fait notre communauté.
Ensuite j’ai beaucoup apprécié la présentation de Ludovic Cinquin sur nos biais cognitifs, sur nos travers qui font que lors de la réalisation de projets informatiques, nous allons nous planter. Du caviar, une très bonne presentation.
Pour terminer nous avons eu la présentation en Français de Leo Apotheker, ex-CEO de SAP. Tout en finesse, à part l’absence de slides, ce fut intéressant. Je reste un peu sur ma faim, pour avoir ré-entendu des trucs déjà entendus l’an dernier. J’ai constaté l’absence des stars ensuite au buffet, il devait y avoir un diner spécial DSI/Stars je pense.
La soirée s’est terminée par un buffet et une dégustation offerte par le site Internet 1855.com, avec la présence d’oenologue. Très bon moment, où nous pouvons discuter de notre métier, où nous pouvons refaire le monde, et qui fait aussi partie de cette événement.
J’ai fait une rencontre avec une personne de la communauté Alt.Net, l’équivalent du Paris Java User Group. Il y a cependant un décalage entre nos 2 univers, la communauté .NET est moins importante en taille (mais pas en valeur) que la communauté Java. Très bonne discussion, je vous en reparlerai prochainement.
Je vous laisse là (oui je sais, tu n’as pas tes 344 billets comme d’hab) mais j’ai une méchante angine, je peux plus parler. Et comme je ne peux plus parler, je ne peux donc pas vous raconter ce soir toute la journée.
A demain.
PS: suivez le tag #usi2010 sur Twitter, y’a pleins d’informations sympathiques.
The pace is good - Milestone 2 of GlassFish Open Source Edition (see roadmap) 3.1 is out (check out TheAquarium post).
Engineering details are here and you can get the bits from [download.java.net] (glassfish-3.1-b06.* )
Trying to keep up with producing screencasts to illustrate the new features, here are two more demos :
a/ more clustering features such as ssh-based centralized admin and deployment.
b/ websockets supports, courtesy of the underlying grizzly engine.
You can read more about these clustering features here (including how to set up ssh) and in Carla's blog.
The above demo is scripted here, and based on Grizzly 1.9.19.
You'll find more information about the future developments of 3.1 on the GlassFish Wiki.
The next milestone is currently scheduled for in about three weeks and most P1 should be integrated.
Plus que quelques jours avant l’USI 2010, qui aura lieu le 1er et le 2 juillet à Paris.
Pour ceux qui ont loupé les épisodes précédents, je vous rappelle la recette de ce très bon cocktail :
- une mesure de Boss, équipé costard-cravate-blackberry
- une mesure de jeunes Geeks équipés tee-shirt/sac à dos/téléphone Android
- une mesure de vieux Geeks équipé chemise/iphone/macbookpro ou iPad
Prenez le tout, secouez fortement, laisser reposer quelques instants, et vous obtiendrez la recette d’une conférence originale.
Comme l’an dernier je vous raconterai ce que je vais voir pendant ces 2 jours. En ouverture nous aurons le plaisir d’accueillir Chris Anderson, le patron du magazine Wired. S’il y a un mag pour les Geeks, c’est Wired. Le top of the top étant de le lire sur un iPad bien entendu.
La matinée de jeudi sera consacrée au thème Innovant. Présentation de David Gageot sur Git, comparaison des différentes solutions de Cloud Computing avec Didier Girard, présentation de Daniel Kaplan, la matinée va être très riche.
Le jeudi après-midi est placé sous le thème Durable. Michael Ballé ouvrira l’après-midi avec Keynote sur le Lean Managment. Ensuite je pense qu’il ne faut pas louper l’enregistrement des CastCodeurs avec Emmanuel Bernard, Vincent Massol et Guillaume Laforge. Antonio est absent cette semaine, mais il sera peut-être en mesure d’appeler les autres ?
L’après-midi parle Lean et entreprise, ainsi que la position des Geeks dans l’entreprise. Je parlerai 20 minutes à 17h00, sur le sujet des communautés et des geeks.
La bonne nouvelle c’est que Neal Ford et Martin Fowler ouvriront la deuxième matinée, sur le thème Ouvert. Pour rien au monde je ne louperai ce show. Merci aux organisateurs d’avoir transformé leur présentation en Keynote, cela permettra d’aller voir les CastCodeurs et de suivre aussi ces 2 Geeks. Mark Surman de Mozillia, Olivier Mallassi du NoSQL User Group (et d’Octo), une présentation en anglais du DG de PayPal France, que du lourd. J’ai noté aussi la présence de Fabrice Epelboin un autre bloggeur (hé on est deux !) et une présentation que j’ai vu en perfection game qui vaut le détour sur la performance, la présentation d’Eric Daspet de SQLI.
Le 4ème temps de l’USI sera placé sur le thème Valeur. Tout d’abord la présence de Greg Young (DDD) ou de Guillaume Duquesnay (relisez mon blog de l’an dernier pour comprendre) qui était présent au dernier Paris JUG avec l’ensemble d’Octo. L’avenir du langage, la place des développeurs, l’outsourcing où le DSI deviendrait un directeur des achats, l’énergie du DSI et le Lean Managment, il y aura de quoi ouvrir de nouvelles perspectives…
Pour terminer, ce sera Fabrice Luchini qui viendra nous faire part de sa vision d’humain, d’acteur et d’utilisateur de tous les machins que nous programmons. A ne pas manquer aussi.
L’USI apporte une vision de notre monde et de notre métier, avec un mélange intéressant entre Geeks et Boss. Si vous voulez encore venir, il resterait quelques places, mais dépêchez-vous. Sinon vous suivrez cela sur le Touilleur Express. Bon, un peu moins vivant, mais je ferai de mon mieux pour vous raconter mes 2 jours là -bas.
Stay tuned comme dirait je sais plus qui.
A jeudi, en teeshirt/cravate/ comme l’an dernier.
Le site de l’USI : [www.universite-du-si.com]

Le développement logiciel est une activité qui fait appel à la créativité. Il y a une part d’expérimentation. J’ai même envie de penser que c’est une activité artistique. Attendez, je ne m’intéresse pas à la beauté du truc. Le code c’est moche. Je parle plutôt du caractère unique de chaque programme, un peu comme une peinture qui est le reflet du sentiment du peintre. Lorsque je développe un logiciel, certes je reproduis des habitudes ou des choses que j’ai vu. Mais je laisse une part importante à l’improvisation et à la liberté. Je pense même que si je devais écrire un bout de code le matin, il n’aurait pas la même tête qu’un bout de code écrit le soir.
Nous avons deux choses à discuter : comment garantir que le logiciel respecte la demande du client tout en étant créatif ? pourquoi cette créativité est une bonne chose pour votre équipe ?
Pour garantir que le résultat est bien celui attendu par le client, nous développons par contrat. Le client exprime ce qu’il veut, nous écrivons alors des tests de recettes pour exprimer ce que souhaite le client. Nous exécutons ces tests, qui échouent initialement. Puis ensuite seulement nous écrivons le programme, nous lançons les tests, nous complétons notre programme, puis finalement nous pouvons dire que le développement est terminé. Donc la réalisation peut faire part à l’imaginaire, mais le résultat final ne change pas (voir la définition de Test Driven Development ou TDD).
La créativité en tant que telle est un facteur qui fait peur à votre chef de projet. C’est un critère non mesurable donc quelque chose qui l’inquiète. Cela se manifeste par quelques phrases comme « …mais c’est pas dans la spéc ? » ou ausi « …tu es sûr qu’il faut ré-écrire cette partie ?« . Tout ce qui n’est pas connu à l’avance fait peur. Soit.
Alors pourquoi la créativité est-elle une bonne chose ?
Elle permet d’apporter une capacité d’adaptation au problème. Elle permet ensuite de trouver plusieurs solutions. Elle permet surtout au développeur de se remettre en question et de ne pas résoudre le même problème de la même façon pendant 20 ans.
Lorsque nous travaillons à plusieurs, la créativité et la curiosité de chacun décuple la qualité d’un logiciel. C’est un garde-fou aussi qui nous évite de dériver lorsque l’on développe. La présence de plusieurs développeurs est important pour réaliser un logiciel. Il faut encourager la programmation en binôme, ou la réunion du matin pour partager ses connaissances, ses soucis et ses bonnes nouvelles.
Je le redis encore une fois : ce qui évite de dériver lorsque l’on développe, que ce soit en terme de coût ou de temps, c’est la présence de plusieurs développeurs. Il suffit de travailler en équipe et de partager à plusieurs les problèmes. Nous devons discuter des solutions, ce qui permet de trouver à plusieurs la meilleure solution à l’instant T pour résoudre le problème.
La curiosité me semble indispensable dans notre métier. Nos connaissances techniques vieillissent vites. Mon expertise sur JSF 1.2 ne me sert plus à grand chose aujourd’hui. Mes connaissances en expressions régulières en Perl me permettent de faire du Groovy, mais guère plus. Ne parlons pas de ce que je savais faire en Tcl/Tk, cela ne me sert à rien aujourd’hui .
Autant fabriquer un violon n’a pas changé depuis 200 ans, autant développer une application de gestion a bien changé depuis les années 90. Et cela ne s’arrêtera pas. Je pense donc qu’il est important de ne pas avoir d’ouvrier-informaticien, mais plutôt des artisans entrainés à apprendre, à chercher des solutions, et à l’écoute des dernières idées. Et un logiciel de génération de code peut en effet faire gagner du temps, voire même montrer les bonnes pratiques.
Etre développeur Java en 2010 c’est dur. C’est un apprentissage assez long. J’étais à la FNAC hier et un bon livre sur Java fait 640 pages. Bon courage à toi qui débute dans le monde Java. Il te faudra apprendre Spring, JEE6, Hibernate, JSF ou Struts 2. Puis un peu de GWT, de Wicket ou de programmation Android. Tu ferras ensuite un peu d’architecture si tu aimes bien modéliser. Tu seras peut-être un expert de l’intégration continue et des bonnes pratiques logicielles… Mais tout ceci te sera enseigné par des vieux développeurs, des bloggeurs, des gars à des conférences, des directeurs techniques passionnés, mais surtout des hommes. C’est la notion de compagnonnage proposée par Martin Fowler et Neal Ford qui seront à l’USI 2010 cette semaine.
Nous sommes un métier qui n’existait pas il y a 50 ans, qui change rapidement et qui demande de la curiosité. Nous sommes donc encore très artisan, et je ne suis pas certain que nous serons des ouvriers industrialisés un jour.
Et moi, ça me plaît.
Crédit photo : Women at work on bomber, Douglas Aircraft Company, Long Beach, Calif. (LOC), octobre 1942. Photo libre de droits tirée de la collection de la Library of Congress, Flickr.com.

Play! Framework est un framework Java dont je vous parle depuis quelques temps. Comme vous le savez, j’ai lancé un site d’offres d’emplois pour passionnés, l’eXpress-Board.fr, réalisé justement avec ce framework Web il y a 2 mois. Le site marche bien. J’ai reçu hier soir le témoignage de Fabrice, qui a signé grâce à l’eXpress-Board.fr
Zenexity est une société Française dont le directeur technique, Guillaume Bort, est aussi le fondateur du framework Play! Zenexity a lancé un nouveau service en bêta il y a quelques jours : PlayApps.net. Il s’agit d’une solution PaaS (Platform as a service) construite en partenariat avec la société Gandi.
Ce service permet :
- d’installer une application Play! Framework en quelques minutes
- de configurer la quantité de CPU et de mémoire selon l’usage de son application
- de gérer les sauvegardes de la base comme de l’application facilement
- d’effectuer l’installation d’une nouvelle version en sauvegardant l’ancienne
- d’afficher des statistiques sur l’application (trafic, mémoire, réseau)
- de suivre les performances dans le temps
- de gérer les bases de données simplement
- de ne pas perdre de temps avec la configuration système
- de se connecter via SSH si nécessaire pour pouvoir travailler avec l’application directement

L’installation est relativement simple. Pour tout vous dire, j’ai migré en 30 minutes mon application existante ainsi que la base de données vers le nouveau serveur, sachant que le plus long a été de me souvenir des commandes MySQL pour exporter/importer la base
. Je ne m’attendais pas à ce que cela soit aussi simple et rapide.
Playapps.net est en bêta, mais il y a déjà 71 applications installées sur la plate-forme. Son accès se fait sur invitation seulement pour l’instant. Si ce projet vous intéresse, vous pouvez demander un accès sur le site PlayApps.net.
A terme, je gagne un système qui me fait gagner du temps, offre un service de qualité à mes clients, et me permet de me concentrer sur le coeur de ma solution, sans devoir bidouiller des serveurs. Par rapport à Google App Engine, sur lequel il est possible de faire tourner Play!, je préfère finalement payer quelques euros par mois pour avoir une vraie plateforme, sur laquelle je peux travailler.
La liste de diffusion de Play! Framework montre que beaucoup de personnes rencontrent des difficultés liées aux limitations de la JVM sur la plateforme Google.
Côté performance, des tests conduits par Guillaume sur l’express-board avec Apache Bench montre que l’application tourne sans soucis à 80 visiteurs par seconde, et que la page d’accueil a une latence moyenne de 57ms avec 20 threads seulement. Le tout avec une JVM qui n’utilise que 64Mo. Oui je sais, ça fait bizarre lorsque l’on pense qu’une application Java peut fonctionner avec si peu de mémoire… C’est 4 fois moins de mémoire que mon iPhone. Quand on utilise pas 10 000 frameworks, croyez-moi ça tourne.
Ce nouveau service ouvre la voie au développement Web léger en Java, ainsi qu’à l’hébergement. Il sera intéressant de revenir sur les différentes architectures Webs et de montrer à quoi peut répondre Play! Framework. Après les plateformes L.A.M.P (Linux Apache MySql Php) nous allons passer aux plateformes LiPlayFraMy (Linux/Play! Framework/MySql) pour un prix similaire, mais sur une JVM.
Moi je dis, ce que font ces gars là est à suivre.
A défaut d'entretenir le bronzage de votre corps d'athlète sur la page par ce beau mois de juin, voici de quoi entretenir vos neurones.
Que fait ce code ?
- public class Quiz39 {
- public static void main(String[] args) {
- int[] array = null;
- try {
- array[0] = array[(array = createArray())[array.length - 1]];
- } finally {
- System.out.println("Array = " + Arrays.toString(array));
- }
- }
- public static int[] createArray() {
- return new int[]{1, 2, 3, 4};
- }
- }
Réponse : Ce code produit un NullPointerException (NPE) mais... initialise correctement le tableau quand même ! Array = [1, 2, 3, 4] Exception in thread "main" java.lang.NullPointerException at net.thecodersbreakfast.quiz.quiz39.Quiz39.main(Quiz39.java:11) at (...) La clé pour comprendre ce comportement surprenant est livrée (comme... Lire Java Quiz #39
Depuis la libération du codec VP8 (et de son conteneur WebM) de ON2 technologies par Google en Mai 2010, la communauté open source (et les amateurs de video !) a trouvé le digne remplaçant de theora, finalement peu performant, et surtout un adversaire de poids face au codec video breveté et certainement pas standard h264.
Cet article a pour but d’expliquer comment :
Pour cela, je vais reprendre en quasi intégralité cet excellent article de Steph sur l’installation de ffmpeg avec support de Webm sur Ubuntu 10.04 (lucid Lynx).
On enlève les versions originales de ffmpeg et eventuellement de x264 :
sudo apt-get remove ffmpeg x264 libx264-dev
On met à jour le système de paquets et on installe les librairies nécessaires sur le système :
sudo apt-get update sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev
Récupération des sources, compilation et installation de x264 (optionnel, si vous voulez aussi encoder en x264) sous forme de paquets pour votre système (checkinstall wrappe « make install » en installant en plus le binaire obtenu sous forme de paquets debian dans votre système)
cd git clone git://git.videolan.org/x264.git cd x264 ./configure make sudo checkinstall --pkgname=x264 --pkgversion "2:0.`grep X264_BUILD x264.h -m1 | cut -d' ' -f3`.`git rev-list HEAD | wc -l`+git`git rev-list HEAD -n 1 | head -c 7`" --backup=no --default
Récupération des sources, compilation et installation de VP8, librairie nommée libvpx sous forme de paquets pour votre système (checkinstall wrappe « make install » en installant en plus le binaire obtenu sous forme de paquets debian dans votre système)
cd git clone git://review.webmproject.org/libvpx.git cd libvpx ./configure make sudo checkinstall --pkgname=libvpx --pkgversion="`date +%Y%m%d%k%M`-git" --backup=no --nodoc --default
Récupération des sources, compilation et installation de ffmpeg (enfin!)sous forme de paquets pour votre système (checkinstall wrappe « make install » en installant en plus le binaire obtenu sous forme de paquets debian dans votre système, à noter que pour ffmpeg vous aurez une erreur lors du checkinstall, qui n’empêchera pas l’installation d’aboutir)
Si vous avez installé x264, vous pouvez ajouter comme ci dessous ajouter le support x264 à ffmpeg : –enable-libx264 ; à noter que l’option –enable-libvpx vous donnera accès à l’encodage webm
cd
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
cd ffmpeg
./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab
make
sudo checkinstall --pkgname=ffmpeg --pkgversion "4:SVN-r`svn info | grep Revision | awk '{ print $NF }'`" --backup=no --default
hash x264 ffmpeg ffplay
Alors il est vrai que c’est toujours plus simple d’installer des paquets avec apt-get install que de compiler des sources, mais le support de webm dans ffmpeg est à ce jour tellement récent que vous ne trouverez pas de paquets pour votre distribution !
Encoder vos vidéos en webm avec ffmpegRien de plus simple !
ffmpeg -i input.avi -threads 2 output.webm
(sauf qu’il semnlearait que le -threads 2, supposé donner 2 threads à ffmpeg, utile pour les dual core, ne soit pas supporté, à ce jour, pour webm)
Lire vos vidéos encodées en webm Avec ffplayVous avez déjà installé précédemment ffmplay :
ffplay output.webmAvec vlc
Vous pouvez aussi les lire avec la dernière version de VLC, à date, la version 1.1.0; il vous faut ajouter un nouveau repo avec les dernières version de vlc, enlever votre version actuelle et ré installer vlc :
sudo add-apt-repository ppa:c-korn/vlc sudo apt-get update sudo apt-get remove vlc sudo apt-get install vlc mozilla-plugin-vlc videolan-doc
Depuis la sortie officielle de VLC en 1.1.0, VLC lit parfaitement les fichiers webm, toutes plateformes confondues !
Avec votre navigateur webMais le véritable intérêt de webm, c’est le web, aussi à cette page, vous sont listées les navigateurs compatibles webm.
Vous y trouverez un paquet debian/ubuntu pour chrome, et en téléchargeant et détarrant un firefox nightly build, vous pourrez aussi les lire avec firefox.
Si vous pouvez lire la video ci dessous, c’est qu’alors vous utilisez un navigateur compatible webm !
Avec chrome version 6.0.437.3 dev , j’ai pu la lire avec succès !
Vous pouvez aussi télécharger la vidéo en enregistrant cette url :
Exemple de vidéo webm à télécharger
Bon encodage Webm à tous !
Sources :
Si je vous dis qu’il y a une conférence gratuite qui se prépare pour septembre en France, vous me croyez ? Le vendredi 10 septembre, le Charentes-Poitou Java User Group organise une conférence à la Rochelle. Des speakers connus comme Emmanuel Bernard, Alexis Moussine-Pouchkine, Tug Grall, Julien Dubois, Nicolas de Loof, Christophe Jolivet, Jérome Benois, Damien Gouyette et Florent Benoit, y’a de quoi passer un moment sympa non ?
Le site JugSummerCamp donne plus de détails, la conférence aura lieu dans un cadre magnifique : à l’espace des Congrès sur le vieux port de la Rochelle. J’y serai, j’espère avoir le plaisir de vous croiser là -bas.
Rendez-vous en septembre !
Nicolas
Le Paris JUG c’est une réunion chaque mois. Le souci c’est que c’est la course pour avoir une place. En principe, les inscriptions sont ouvertes le jeudi précédent la session, à midi pile, afin que chacun puisse s’inscrire. Mais malgré cela, les places partent très vites. 178 places en 1h30 la dernière fois… Pas évident pour le gars qui débarque et qui ne sait pas que c’est la course.
Bref ce n’est pas pour cela que je voulais vous parler du Paris JUG, mais pour un tout autre sujet, très important. Chaque mois, David filme, Charles se charge de l’encodage et les vidéos sont mises en ligne sur Parleys. Cela vous permet de revoir des sessions que vous auriez loupé, ou même, de regarder la vidéo les pieds dans l’eau de Petahoui.
L’adresse qu’il faut diffuser, à ses amis, à ses collègues, à sa femme et ses enfants :
L’URL ne fait pas très Web, mais ça marche.
Je blague sur Tahiti, mais quelqu’un de SpringSource a fait une formation là -bas l’an dernier.
Allez, ce soir je me fais la près Android et Google App Engine/Gaelyk.
About three months ago, this RoadMap document was presented to the community and by all means it was well accepted (downloads approaching five digits).
Now, while roadmaps are great, releases are even better. So, I'm happy to say that GlassFish 3.0.1 has been released as expected. Not only the open source version but also the commercially supported Oracle GlassFish 3.0.1 product as well as an update to the Java EE 6 SDK integrating this new version of the runtime. As a reminder, GlassFish 3.0.1 is a modular, OSGi-based, open source Java EE 6 application server.
Favorite features.
While this "100-day" release had a limited scope (check the roadmap for further releases and directions), I do want to point out my top 2 features:
• broader platform support: jrockit, Oracle Enterprise Linux, multiple flavors of RHEL, SLES, Windows, even HP-UX (!) much more platforms with 64-bit JVM support.
• integrated fixes: with over 100 bugs fixed since v3 came out last December, there really is no reason NOT to upgrade.
Get it using the UpdateCenter.
While you can download the bits from this page, you can also upgrade an existing v3 install to the newer 3.0.1 using the GlassFish update center. Unless you've played with the repository settings of your install, you should have a "stable" or "release" repository set as preferred, so all you need to do is update using the updatetool (bin/updatetool) or the command line (bin/pkg image-update).
In fact you may already have been notified that a number of new packages (the 3.0.1 release) are available as updates. The UpdateCenter feature can not only update an existing install, it can also help you move from the community install to the supported version without a reinstall, see this document for more details.
Maven, tooling, localized versions, download size, v2.x, ...
Also of interest with this release are the availability of updated Maven artifacts, and multi-lingual distributions (German, Spanish, French, Japanese, Portuguese, Korean, Chinese and Simplified Chinese, none of which were available in v3).
As a quick data point, the smallest GlassFish you can get (web profile Unix bundle) is just a 33MB download. That's only 2 firefox copies, about 5x less than other popular appservers, and 20x less than a recently released office suite... If you are still wondering if the 3.x branch is good for you, we've updated the GlassFish 2.1.1 vs GlassFish 3.0.1 matrix.
Finally, NetBeans 6.9 is out and ships with GlassFish Open Source Edition 3.0.1. So if you've updated to the latest version of NetBeans, you probably already have the lastest GlassFish as well!
Update: See also this announcement and this Aquarium post.
Je vous propose un petit article technique sur Maven2, JPA et plus particulièrement la gestion de plusieurs persistence.xml. Cet article intéressera les personnes qui ont un projet avec JPA, et qui souhaitent gérer une version pour le packaging final et une version pour les tests unitaires ou d’intégrations. J’ai eu ce cas lors de la mise en place de tests Fits, où nous souhaitions pouvoir utiliser un profil JPA pour les tests avec H2, capable de fonctionner en mode « base de données en mémoire/base de données serveur TCP », et un profil classique avec Oracle.
Dans mon exemple, je souhaite gérer 2 datasources distinctes : une pour l’exécution de l’application, et une autre pour l’exécution des tests unitaires. Lors de l’exécution de mon application, mes classes sont annotées et j’ai donc aussi besoin que le moteur JPA trouve celles-ci, afin de les instrumenter. Une datasource utilise une base Oracle, une autre datasource utilise le mode « in-memory » d’h2.
Approche simpleLa première approche est simple :
- écrire un fichier générique persistence.xml dans src/main/resources/META-INF
- déclarer des propriétés dans votre pom.xml
- éventuellement avoir un profil maven pour les tests et un profil pour l’exécution de l’application
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="sample-db" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="${hibernate.dialect}"/>
<property name="hibernate.hbm2ddl.auto" value="${jdbc.hbm2ddl.auto}"/>
<property name="hibernate.show_sql" value="${jdbc.show_sql}"/>
<property name="hibernate.format_sql" value="${jdbc.format_sql}"/>
<property name="hibernate.connection.url" value="${jdbc.url}"/>
<property name="hibernate.connection.driver_class" value="${jdbc.driver}"/>
<property name="hibernate.connection.username" value="${jdbc.username}"/>
<property name="hibernate.connection.password" value="${jdbc.password}"/>
</properties>
</persistence-unit>
</persistence>
Le fichier pom.xml contiendra ensuite 2 profils. Un profil permet d’activer le mode « base de données en mémoire » avec H2, pratique pour les tests unitaires. Un deuxième mode permet de se connecter via TCP sur une instance d’H2 démarrée en local, pratique pour vérifier l’état de la base à posteriori, sans utiliser DbUnit pour l’instant.
Fichier pom.xml :
<project>
...
...
<profiles>
<profile>
<id>h2-tcp-db</id>
<properties>
<jdbc.url>jdbc:h2:tcp://localhost/~/test_db;MODE=Oracle</jdbc.url>
<jdbc.driver>org.h2.Driver</jdbc.driver>
<jdbc.username>sa</jdbc.username>
<jdbc.password></jdbc.password>
<jdbc.format_sql>false</jdbc.format_sql>
<jdbc.show_sql>false</jdbc.show_sql>
<jdbc.hbm2ddl.auto>create</jdbc.hbm2ddl.auto>
</properties>
</profile>
<profile>
<id>h2-inmemory-db</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<jdbc.url>jdbc:h2:mem:test_db;MODE=Oracle;DB_CLOSE_ON_EXIT=FALSE</jdbc.url>
<jdbc.driver>org.h2.Driver</jdbc.driver>
<jdbc.username>sa</jdbc.username>
<jdbc.password></jdbc.password>
<jdbc.format_sql>false</jdbc.format_sql>
<jdbc.show_sql>false</jdbc.show_sql>
<jdbc.hbm2ddl.auto>create-drop</jdbc.hbm2ddl.auto>
</properties>
</profile>
</profiles>
</project>
Cela répond aux cas simples. Si par contre vous devez gérer plusieurs formats de fichier persistence.xml, cela se complique un peu. Il est possible de déclarer une datasource pour les tests, une autre pour l’exécution. Jusqu’ici pas de soucis. Mais avouez que packager une datasource de tests dans l’application finale, ce n’est pas top non ?
Approche avec 2 fichiers persistence.xmlJ’ai cherché à configurer Maven et mon environnement afin d’avoir un fichier persistence.xml dans mon répertoire src/main/resources/META-INF pour la prod, et un deuxième fichier de persistence dans src/test/resources/META-INF pour mes tests unitaires et mes tests d’intégrations.
Armé de ma meilleur volonté, j’ai commencé par déposer un deuxième fichier persistence.xml dans le répertoire src/test/resources/META-INF en me disant que ce serait bon… Et bien non.
Le fichier est copié lors de la phase « test » comme prévu, les variables sont remplacées si vous n’avez pas touché au plugin maven-resource.
<!-- fichier pom.xml --> <project> ... ... <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <testResources> <testResource> <directory>src/test/resources</directory> <filtering>true</filtering> <excludes> <exclude>**/fit/**</exclude> <exclude>**/reports/**</exclude> </excludes> </testResource> </testResources> </build> ... </project>
Tout fonctionne du côté de Maven, mais par cotnre le mapping JPA ne fonctionne plus. En effet, le fichier étant déposé dans target/test-classes, et ce répertoire ne contenant pas mes entités annotées, JPAne peut rien faire. La solution semble donc de trouver le moyen de dire à JPA où trouver les classes (dans target/classes).
Le tag jar-file permet de spécifier l’emplacement d’un jar ou d’un répertoire différent pour JPA, qui sera utilisé afin d’y trouver les classes annotées.
Voici le fichier persistence.xml tel que je souhaite qu’il soit au final dans mon répertoire target/test-classes/META-INF :
<?xml version="1.0" encoding="UTF-8"?>
<!-- Fichier final dans target/test-classes/META-INF -->
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="test_db" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jar-file>file:/C:/Dev/monprojet/target/classes</jar-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="${jdbc.hbm2ddl.auto}"/>
<property name="hibernate.show_sql" value="${jdbc.show_sql}"/>
<property name="hibernate.format_sql" value="${jdbc.format_sql}"/>
<property name="hibernate.connection.url" value="${jdbc.url}"/>
<property name="hibernate.connection.driver_class" value="${jdbc.driver}"/>
<property name="hibernate.connection.username" value="${jdbc.username}"/>
<property name="hibernate.connection.password" value="${jdbc.password}"/>
</properties>
</persistence-unit>
</persistence>
Notez que pour le tag jar-file, il faut utiliser une URI, pas un chemin technique. Ce qui va compliquer un peu notre travail dans quelques instants. La question est maintenant la suivante : comment remplacer file:/C:/Dev/monprojet/ par le répertoire de base de Maven ? le tout sous la forme d’une URL ?
Euréka, Maven depuis la version 2.1 propose une propriété project.baseUri qui correspond exactement à ce que je veux au final : file:/C:/Dev/monprojet/.
Je remplace alors le tout dans mon fichier test/resources/META-INF/persistence.xml comme suit (attention au dernier slash qui est ajouté systématiquement):
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="test_db" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jar-file>${projectBaseUri}target/classes</jar-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="${jdbc.hbm2ddl.auto}"/>
<property name="hibernate.show_sql" value="${jdbc.show_sql}"/>
<property name="hibernate.format_sql" value="${jdbc.format_sql}"/>
<property name="hibernate.connection.url" value="${jdbc.url}"/>
<property name="hibernate.connection.driver_class" value="${jdbc.driver}"/>
<property name="hibernate.connection.username" value="${jdbc.username}"/>
<property name="hibernate.connection.password" value="${jdbc.password}"/>
</properties>
</persistence-unit>
</persistence>
Je lance mvn test, et je vais voir le résultat : ma variable n’est pas remplacée, elle reste positionnée à project.baseUri… Bon, vieux réflexe de gars qui connait bien Maven 2, allons voir sur les bugs s’il n’y aurait pas un beau bug dans la dernière version de Maven…
Trop facile, je trouve celui-ci : MRESOURCES-99 ${project.baseUri} and ${maven.build.timestamp} are not expanded by resource filtering
Il y a un workaround simple : déclarer la propriété dans votre pom.xml comme ci-dessous :
<properties>
<timestamp>${maven.build.timestamp}</timestamp>
<projectBaseUri>${project.baseUri}</projectBaseUri>
</properties>
Et là enfin, tout fonctionne. Un petit « mvn test -Ph2-inmemory-db » et je lance mes tests en mémoire avec un fichier persistence.xml dédié.
Pour terminer, voici mon fichier persistence.xml final, tel qu’il est actuellement :
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="test_db" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- When using test mode, you must introspect the Entities in a different folder, so that create schema works -->
<!-- There is a bug in maven 2.2.x http://jira.codehaus.org/browse/MRESOURCES-99 so I added a property in the main pomx.xml-->
<jar-file>${projectBaseUri}target/classes</jar-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="${jdbc.hbm2ddl.auto}"/>
<property name="hibernate.show_sql" value="${jdbc.show_sql}"/>
<property name="hibernate.format_sql" value="${jdbc.format_sql}"/>
<property name="hibernate.connection.url" value="${jdbc.url}"/>
<property name="hibernate.connection.driver_class" value="${jdbc.driver}"/>
<property name="hibernate.connection.username" value="${jdbc.username}"/>
<property name="hibernate.connection.password" value="${jdbc.password}"/>
<!-- other hibernate properties for historization -->
<property name="hibernate.ejb.event.post-insert"
value="org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener"/>
<property name="hibernate.ejb.event.post-update"
value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener"/>
<property name="hibernate.ejb.event.post-delete"
value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener"/>
<property name="hibernate.ejb.event.pre-collection-update"
value="org.hibernate.envers.event.AuditEventListener"/>
<property name="hibernate.ejb.event.pre-collection-remove"
value="org.hibernate.envers.event.AuditEventListener"/>
<property name="hibernate.ejb.event.post-collection-recreate"
value="org.hibernate.envers.event.AuditEventListener"/>
</properties>
</persistence-unit>
</persistence>
Conclusion
Voilà , je ne sais pas si cela pourra vous servir. Je me sers aussi du Touilleur Express comme d’un cahier où je note ce que je trouve, c’était l’idée au départ du blog. Si vous avez d’autres idées, n’hésitez pas à contribuer via les commentaires.
J’ai terminé la lecture du livre « Gestion de Projet Agile« , 3e édition, écrit par Véronique Messager Rota. Publié chez Eyrolles, l’ouvrage de 278 pages s’adresse à deux publics à mon avis. D’une part les personnes du « canal historique » de la gestion de projet, à la recherche d’un éclaircissement sur les méthodes de Gestion Agile. D’autre part, ceux comme moi qui ont abordé la gestion de projet grâce aux méthodes Agiles, et qui souhaitent compléter leurs connaissances.
L’ouvrage commence par un questionnaire qui permet d’identifier sa connaissance de la gestion de projet. Le choix entre méthode de gestion de projets traditionnelles et méthode Agile est proposé au lecteur un peu plus loin. Ce que vous apprécierez, c’est la vraie démarche d’accompagnement pour passer des méthodes traditionnelles aux méthodes Agiles. L’expérience de l’auteur permet de trouver les mots justes.
Le recueil des exigences est couvert en proposant plusieurs techniques pour hiérarchiser les besoins correctement. La gestion du temps, la planification des ressources, avec une démarche itérative, on parle même de la technique du Pomodoro dont j’avais entendu parler par Eric Lefevre.
A propos d’expert, un nombre important de personnes connues de la communauté francophone a participé au livre. Des témoignages appuient la présentation de Véronique. 16 experts en tout, dont Christophe Addinquy, Régis Médina, Laurent Bossavit, David Gageot, Claude Aubry, Freddy Mallet pour ceux que je connais par exemple.
Les derniers chapitres sont consacrées au pilotage du projet avec des indicateurs de qualité, de risque et de performance. Un chapitre est consacré à la gestion de l’équipe, à la gestion des sous-traitants et à l’animation des équipes. Très justement placé dans le cadre de la gestion de projet Agile.
Enfin le livre se termine par un accompagnement du changement. Si vous souhaitez passer à l’Agile, la conduite du changement est bien expliqué.
En conclusion je pense que ce livre est un pont entre la gestion classique et la gestion de projet Agile. Il sera lu facilement par un chef de projet à la recherche d’un guide de démarrage complet. Je le conseille aussi aux Scrum Master, qui souhaitent élargir le spectre de leurs connaissances. Le recueil de besoin comme la gestion des hommes sont bien expliqués.
NetBeans 6.9 final is now out!
This is the first release under the new Oracle era.
It has a good number of new features for an n+1 dot release. OSGi support and enhanced Java EE 6 (including web services) are the ones that make most sense from where I stand.
For a quick 5-minute overview, check out this nice screencast.
If you're interested in the CDI-related updates, check out the screencasts previously listed on this Aquarium post.
Browsing through the NetBeans website I'm reminded how much I envy their graphics guys ;)
Direction les montagnes (et pas n'importe lesquelles) la semaine prochaine pour parler de Java EE 6 et de GlassFish à Grenoble le 22 juin (à l'Alpes JUG) et à Genève le 23 (au GenevaJUG). Au delà de mes sujets de présentation favoris, ce sera l'occasion de voir ou revoir des têtes connues et j'espère d'une bonne discussion (avant et pendant la 3ème mi-temps). Aller, pour lancer le débat :
• Spring est-il soluble dans Java EE 6?
• Tomcat est-il soluble dans GlassFish?
• OSGi va-t-il nous sauver comme Maven l'a fait en son temps?
• GlassFish est-il soluble dans WebLogic?
Réponses la semaine prochaine! Venez nombreux!
La deuxième journée de la conférence Agile France 2010 commence par une Keynote d’Esther Derby. Il a fallut attendre une heure pour voir la première grosse présentation à ne pas louper : Satisfaire complètement son client avec le Problem Driven Development par Régis Medina. Cette visite guidée dans l’univers de Régis a été passionnante, je vous propose de suivre la session avec moi.
Quelques mots sur le speaker. Régis Medina est bien connu dans la communauté Agile Française. Coach Lean spécialisé dans l’accompagnement des équipes techniques, il découvre XP en 98, il a co-écrit avec d’autres auteurs le livre « Gestion de projet : eXtreme-Programming » paru chez Eyrolles. C’est un orateur passionnant, qui propose une vision où le Lean et l’Agile sont mis en parallèles. Et accessoirement c’est un utilisateur d’IDEA IntelliJ, donc je +1 avec plaisir.
Arrêtons-nous un instant sur ce que nous produisons. Parfois, nous suivons à la lettre ce que demande le client. Peu importe la méthode de développement, ou de gestion de projet. Lorsque l’on regarde quelques temps plus tard certains projets, certains apparaissent comme dangereux. Regardez cette théière utilisé par Régis pour illustrer son idée, fruit du travail de Donald A.Norman. Sur le plan du cahier des charges, l’ensemble des besoins sont développés. Simplement, cet objet est inutile. Et combien de projets ou d’outils inutiles avons-nous croisé dans notre carrière ?
Régis Medina pose la question suivante : « Comment faire des logiciels en mesure de satisfaire pleinement les clients ?« .
A priori, la réponse serait de prendre une bonne méthode de développement, et une bonne méthode de gestion de projet. Prenons le cycle en V, qui anime les soirées d’hiver et qui permet de se chauffer grâce aux tonnes de documentations produites…
Faire une spécification pour certains utilisateurs, c’est un peu découper le catalogue de la Redoute dans les pages Jouets. Certains utilisateurs, de peur de manquer, chargent à mort les spécifications fonctionnelles. Le fait de demander en amont aux clients, puis de spécifier de manière exhaustive leurs besoins, peut conduire parfois à une perte de temps, à un certain gâchis.
Les spécifications c’est fait. La conception ressemble ensuite à une équipe dans un sous-marin nucléaire. Impossible d’accéder à l’équipe de développement, c’est du cycle en V. Si tu veux leur parler, on te demandera d »Ã©crire une spécification. Et de la donner aux développeurs avec une fourche.
Une fois le développement terminé tant bien que mal, souvent à l’arrache, vient le temps de la validation. Autant éteindre un feu avec un verre d’eau. Si la Validation se passe bien (ahahah) vous irez en production. Ne donnez pas votre vrai nom au gars qui fait la mise en prod. Il serait capable de venir vous casser la figure. Le déploiement… Régis utilise l’image d’une personne qui a peur.
Alors arrive l’Agile
Après avoir dépeint un tableau noir de la situation, Régis passe à la page « Agile ». Premier principe : nous allons écouter le client et délivrer des incréments de logiciels qui fonctionne, petit à petit. Cela permet de lisser l’inconnu et de s’assurer que le logiciel fonctionne.
Régis explique cependant, qu’en appliquant trop à la lettre les demandes des clients, vous risqueriez de développer une théière avec un manche mal placé. Le client ne sait pas toujours exprimer correctement ses besoins. Et faire de l’Agile, faire du Scrum, ne veut pas dire « ne pas prévoir à 2 ou 3 mois » ou « ne pas faire de l’Architecture ». C’est un anti-pattern de Scrum, que de croire que l’Architecture émerge magiquement du développement (ça c’est de moi).
Le Client n’est pas concepteur de logiciel. Pourquoi lui demander d’apprendre l’UML pour exprimer son besoin ? Si vous commenciez par écouter, et par apprendre le domaine du client… Je sens que Régis est aussi un fan de DDD comme moi.
Alors vient souvent la phrase « oui mais il faut un BON Product Owner« . Cette phrase est à mon avis un moyen élégant de dire « le client est un abruti, il en faut un plus intelligent« .
Je retourne la question : « Oui mais il faut une BONNE équipe capable d’écouter le client« .
Cela va mieux dans ce sens là non ?
Régis explique l’importance de définir le domaine du client, de cadrer les frontières de son problème. Il recommande de travailler par exploration, de découvrir le domaine, les mots du clients, à s’approprier le vocabulaire et la connaissance de celui-ci. C’est du DDD non monsieur Medina ?
Et bien il poste un nouvel acronyme : PDL pour Problem Driven Development.
Notre mission sera désormais de résoudre les problèmes des clients. Et de les résoudre complètement. Les tests vont piloter le développement. Nous, développeurs, sommes là pour comprendre, analyser et résoudre les problèmes du client.
Pour cela, Régis propose d’appliquer deux des principes du Lean :
– Plan Do Check Adjust
– Aller sur le terrain (Gemba)
Demandez à aller voir le client, l’utilisateur qui sera 8h par jour avec votre logiciel. Regardez comment le client utilise votre logiciel, ou comment il utilise un logiciel similaire. Listez les problèmes qu’il rencontre, et tirez-en des leçons pour vraiment écouter le client.
La voix du client
Prenons les 5 points suivants :
1. Donne moi exactement ce que je veux
2. Quand je le veux
3. Où je le veux
4. Soyez fiables
5. Ne me faîtes pas perdre mon temps, je n’ai pas envie d’apprendre
Le point 1 apporte la valeur. Les points 2 à 5 seront du gachis pour le client s’ils ne sont pas respectés. Les 2 points les plus importants : le 1 et le 5 : donnez moi exactement ce que je veux et ne me faîtes pas perdre mon temps, je n’ai pas envie d’apprendre à utiliser votre logiciel. Le meilleur exemple ? Pensez à l’iphone. Avec une ergonomie et une puissance importante, vous allez à l’essentiel. Si seulement nos bonnes vieilles applications de gestion pouvaient s’en inspirer…
Le meilleur service finalement, c’est celui que l’on ne voit plus. Régis nous demande de réflechir à tout ce qui est mis en oeuvre entre toi, lecteur qui lit cet article, et les byes stockés dans une base MySQL sur un serveur quelque part… sans parler d’électronique. Vous vous rendez compte du parcours de l’information ?
La démarche d’être très simple, très rapide et très efficace est aussi illustrée par Google. Lorsque vous arrivez, que vous tapez un mot, puis que vous partez sur une page de résultat, il s’écoule moins de 5 secondes… Quand on pense à tout ce qui se passe derrière, en amont, c’est assez impressionnant.
Régis propose donc de nous faire réfléchir aux meilleurs choix pour résoudre le plus efficacement possible le problème du client.
Regarder la performance
On ne peut améliorer que ce que l’on mesure. Il faut des indicateurs, afin de se rendre compte de ses progrès ou non. Que ce soit le nombre d’utilisateurs, le nombre d’appel sur la hotline, ou le taux de pertes de paquets réseaux, il faut des indicateurs.
Voir les problèmes
Un problème est l’écart entre l’indicateur et sa valeur actuelle. Gemba dans la démarche Lean, nous pousse à aller sur le terrain, pour comprendre ce qui cloche. Regardez l’utilisateur, la séquence d’utilisation, les stratégies d’évitement qu’il met en oeuvre pour résoudre un problème… c’est très intéressant. Comme dit Régis : « tant que l’on ne l’a pas vu… on ne l’a pas vu… c’est le problème ».
La courbe de connaissance entre vous, développeurs, et eux, les utilisateurs, est aussi très importante. Un développeur « sait » comment marche son logiciel, puisqu’il l’a codé. Quel est l’écart entre ce que sait le client et ce que vous savez ? Quel est la taille du problème (cf plus haut) ?
Inversement, les développeurs parfois ne connaissent pas le métier fonctionnel. Cela donne des perles, comme des objets financiers implémentés avec des getter/setter, alors que l’objet lui-même, dans la vraie vie, EST IMMUABLE ! Je m’égare…
Résoudre le problème
Résoudre c’est bien, mais il faut être proactif, et il faut penser en permanence à l’amélioraton du système. Pour cela, la technique du PDCA : Plan Do Check Adjust. Il faut voir les causes d’un problème, anticiper le résultat lorsque le souci sera corrigé, élaborer une contre-mesure en cas d’erreurs.
En tirer de bonnes leçons
Ecoutez les clients, et mettez en place des ateliers d’apprentissage afin que les développeurs s’approprient le domaine du client. Pour travailler, faites des ateliers de prototype, des interviews, des sessions de brainstorming avec le client. Lorsque vous développerez votre prochain site Web avec Play! Framework, ou votre application de gestion sérieuse avec Play! Framework, pensez aux écrans, à l’idée que pour résoudre un problème, il faut aller vite.
Imaginez Google ou l’interface de l’iphone développé par un gars qui n’aurait aucunes idées de votre besoin… ou qui ne chercherait pas à résoudre efficacement et rapidement vos problèmes…
Conclusion
En conclusion, Régis nous rappelle les principes de la démarche Lean, et de sa possible mise en place dans les équipes de développement logiciel. Avec de grands principes, qui placent le client au centre des préoccupations, j’ai bien accroché. J’aime aussi cette vision où le développeur et ses frameworks n’est plus le plus important. C’est vrai que parfois, nous donnons l’image de gosses qui bidouillent avec une boîte de « Petit chimiste », alors que l’on nous demande juste de faire une chose : résoudre les problèmes des clients simplement, le plus efficacement possible, et sans lui faire perdre son temps.
A méditer.
Merci à Régis, en espérant avoir retranscris l’esprit.
J'ai vécu la soirée des soirées NLPNL qui a eu lieu ce lundi 14 juin 2010 comme un moment particulier, un moment de "Passage" et/ou de “pas sage", sur le thème du choix et du non choix. Entre le clean language qui invite à créer soi-même ses métaphores, les contes métaphoriques qui nous emmènent dans notre propre univers, la systémique collaborative où nous sommes en total responsabilité de notre vécu du système et de notre (ré)action, le questionnement sans réponse où le client prend choix de sa question, le déclencheur photogénique qui invite au passage expressif identitaire, les mots ramenés à leur sens et en polarité comme des aiguilles réactivant les points vitaux existentiels, quel est le lien ?
Qu'est ce qui crée ce passage ? D'où vient-il ? Où va t-il ? Personne ne le sait et pourtant il est bien présent en chacun de nous... Un beau mystère de la vie, de l'existence.
Merci à Andrée Zerah pour cette clôture ouverture des soirées NLPNL
Following the recent release of Milestone 1 of GlassFish 3.1, it's time for a new Community Update today @ 9am PT (18:00 for most of Europe). Simply point your browser to [www.ustream.tv]. Further details here.
Update: a replay is now available (we did have some technical difficulties but it's easier to skip through those).
Le Paris JUG accueille pour sa séance du mois de juin un invité de marque, en la personne de Holly Cummins.
Holly présentera deux séances ce soir :
Vous trouverez ci-dessous une retranscription en temps réel de la conférence, sous la forme d'une Wave. N'hésitez pas à participer !
(PS : Google Wave est désormais en accès libre, si vous n'avez pas de compte il vous suffit de vous inscrire !)
var wavePanel = new WavePanel({rootUrl:'http://wave.google.com/wave/', bgcolor:"#FFF"}); wavePanel.loadWave('googlewave.com!w+NsKw9vgrA'); wavePanel.init(document.getElementById('waveframe'));... Lire Paris JUG "Holly Cummins"

Crédit photo : http://flickr.com/photos/ecstaticist/
J’avance tranquillement sur la préparation de mon sujet pour la conférence USI 2010, le 1er et le 2 juillet. Le premier test grandeur nature s’est bien passé, avec l’aide de Guillaume et de Pierre d’OCTO. Il y a encore quelques points à améliorer, mais ça avance. Je voulais partager avec vous les premières idées observées depuis que je travaille sur ce sujet.
J’ai envie de parler de notre aventure. La conférence de l’USI s’adresse à 2 publics : les Geeks et les Boss. J’ai 20 minutes pour présenter un sujet sur la communauté, sur l’aventure de ces dernières années. Dans ma tête il y a un mélange de JUG, de Devoxx, de l’aventure d’indépendant, du blog le Touilleur Express, des soirées, des rencontres, bref de tout ce qui peut se passer, pour peu que tu mettes le nez dehors.
Idée 1 : le Geek 1.0 est une espèce en voie de disparition
Première idée, c’est que le Geek classique est une espèce en voie de disparition. Lorsque je dis cela, j’ai l’image des gars de Microsoft qui, en 1979, faisait un peu peur. J’ai l’image d’un Geek classique, passionné, mais qui doit se battre pour défendre ses idées. Oui ce n’est pas toujours évident d’assumer sa passion pour sa TI-82 lorsque l’on est jeune, ou pour son Nexus qui plante tout le temps lorsque l’on est vieux.
Didier Girard a lancé le terme de Geek 2.0. Je crois que vous le connaissez. C’est un gars qui fait de l’informatique, mais qui a dépassé le côté technologique. Le Geek 1.0 est une brute sur Zunbuntu. Le Geek 2.0 est une brute de communication. C’est un passionné aussi. Lui ce qu’il cherche c’est avant tout les autres. C’est un bonhomme qui participe aux conférences, aux BarCamps, aux soirées du Paris Java User Group. Ou forcément c’est un peu moi, ça tombe bien c’est plus facile pour s’en rendre compte.
Le Geek 1.0 a un projet open-source obscur sur SourceForge.net. Le Geek 2.0 a 1209 followers, il a fait une présentation sur Scala à Jazoon. Pour moi, c’est un bonhomme massivement communiquant. Twitter, Facebook, les blogs, les soirées entre collègues, c’est le bonhomme qui sort dehors.
Bref j’essaye de définir ce nouveau comportement qui a explosé ces 2 dernières années dans le monde Java. J’essaye de mettre un nom sur 50 français à Devoxx, qui chantent dans un bar Irlandais. J’essaye de comprendre comment on peut parler en franglais dans une salle de 600 personnes à Devoxx, en présentant « Google Appe enjineu » et où tout le monde trouve cela génial.
Idée 2 : trouver des passionnés est un exercice compliqué
Je ne compte pas le nombre de fois où l’on m’a demandé : « Hé Nicolas, tu ne connais pas un gars motivé qui voudrait bosser pour moi ? » ou sinon la version candidat : « Hé Nicolas, tu ne connais pas une société sympa sur Paris ? ». Cela s’est concrétisé avec l’eXpress-Board.fr, dont une grande partie a été réalisé grâce aux idées de la communauté.
J’essayerai d’utiliser des images à l’USI. J’ai pensé à l’image du Safari. Vous êtes Boss, vous voulez recruter des Geeks ? Des brutes de la programmation Java ? Allez chercher les grands fauves là où ils se trouvent. Oubliez les grands sites d’emplois monstrueusement ennuyant surtout les jeudis, essayez plutôt de mettre le doigt de pied à une soirée comme un Paris JUG. Manque de bol pour vous, si vous êtes un Boss vous serez rapidement remarqué.
Vous pouvez alors vous transformer en Beek ou en Goss comme Didier Girard le disait. Ou sinon vous pouvez simplement envoyer vos salariés, vos passionnés. Si je vous disais que 46% des personnes sondées en avril ont répondu « qu’elles envisagent de changer de poste » cela laisse rêveur non ? A vous d’être déjà présent le jour où ils souhaiteront changer de poste.
En fait je vais vous l’avouer : nous les Geeks, nous n’utilisons pas beaucoup les sites d’emplois. D’après le sondage, c’est avant tout nos anciens collègues qui peuvent nous donner un bon tuyau. Autant dire que si vous n’avez pas de système de cooptation, c’est dommage.
J’ai observé de belles aventures depuis que je participe au Paris JUG. J’ai des visages de personnes qui s’ennuyaient et qui ont rejoint une entreprise non pas à cause du salaire, mais avant tout à cause des passionnés qui y travaillent déjà . C’est de cette observation que vient mon idée de dire aux employeurs : aidez et lancez vos salariés les plus passionnés dans la communauté.
Vous êtes prêt à dépenser 600 EUR pour 15 jours d’annonce sur un site d’offres d’emplois grand public, mais vous ne voulez pas payer une conférence de 3 jours à votre meilleur élément ? Devoxx c’est 210 EUR, un billet de train à 75 EUR de Paris, deux nuits d’hôtels à 48 EUR… Et c’est juste la PLUS GROSSE CONFERENCE pour la communauté Java avec 3200 développeurs du monde entier. Et tellement peu de français… Quel dommage.
Idée 3 : il y a un avant et un après Paris JUG
Clairement, il y a 2 personnes qui en région parisienne ont fait changer les choses. Antonio Goncalves avec le Paris JUG et Luc Bizeul avec les BarCamps. Je vais simplement vous expliquer ce qu’il s’est passé le jeudi 4 juin dernier. Nous avons ouvert les inscriptions pour la soirée du Mardi 8 à midi. Deux heures plus tard, 178 personnes s’étaient inscrites. Chaque mois, les places partent en une journée, grand maximum. Je tiens à en parler aux Boss lors de l’USI, en montrant quelques photos de l’évolution de l’affluence.
Certes, le Paris JUG c’est gratuit, on peut y boire un coup entre 2 conférences, et nous recevrons une fille mardi soir prochain (Holly Cummins d’IBM).

Holly Cummins et Kirk Pepperdine
Mais mince, il y a des conférences qui peinent à trouver 100 personnes, même gratuitement, en plusieurs mois.
Et puis il y a le Paris JUG.
200 geeks, chaque mois. Une cinquantaine au restaurant, une bonne dizaine jusqu’à tard dans la nuit, 450 personnes à l’anniversaire… Un truc de dingue. J’arrive pas à comprendre et cela donne envie de continuer, pour ne pas laisser retomber le soufflet.
Les Barcamps sont aussi des moments importants, qui ont permis à d’autres communautés de se rencontrer. Il y a enfin un grand nombre de User Groups, sur tous les sujets : le Google User Group, le NoSQL User Group, le DDD User Group, le Scala User Group, bref j’en passe.
Qu’est-ce que j’essaye de dire ?
Les User Groups en France ont mis du temps à démarrer. Aujourd’hui il y a 14 User Groupes en France. Didier Girard doit écrire un billet où il racontera ce qu’il a vécu lors de sa tournée des UG Java en France. Du gars qui fait tout lui-même, sans trop de sponsors, à ceux qui sont 8 pour tout organiser. Il y a celui qui lit des news sur Java à chaque début de séance. Il y a ceux qui sont plutôt sérieux. Il y a d’autres qui sont très universitaires… Chaque région raconte son histoire.
Idée 4 : nous ne resterons pas 10 ans chez vous
Une idée ensuite dont je souhaite parler aux Boss, c’est le caractère éphémère de notre présence dans leur entreprise. J’ai vraiment l’image d’un joueur de foot lorsque je regarde mon propre parcours. J’ai changé volontairement d’entreprise tous les 3 ans. J’ai fait mon parcours uniquement chez des éditeurs, plus par hasard que par réel choix. Puis je suis devenu indépendant. Et je serai certainement salarié à nouveau un jour. Mais ce qui est assez intéressant, c’est que je n’ai pas hésité à bouger lorsque quelque chose ne me convenait plus. En discutant avec différents juggeurs, chacun m’a raconté une histoire où presque invariablement, c’est eux qui décident de partir.
Le salaire n’est pas le premier critère qui fait bouger un Geek. C’est avant tout la mission ou le projet, donc le sens du travail. Les perspectives d’évolution sont importantes, puis en effet, le salaire. Mais ce que je souhaite donc expliquer à nos Boss est limpide : nous ne sommes pas là pour faire de vieux os, et nous n’hésitons pas à changer d’entreprise.
Pour quelles raisons ? Avant tout, crise ou non, nous avons la chance d’intéresser, d’être une ressource rare sur le marché. Les jeunes diplômés ont autant de chances que les personnes avec 15 ans d’expérience. Mais il y a une tranche qui reste très courtisée : les 3-5 ans d’expérience. Il suffit de parler avec les chargées de recrutement, ce que j’ai fait pendant plusieurs mois pour l’eXpress-Board.fr. Certains profils sont aussi rares que difficiles à intéresser.
Idée 5 : pour que les passionnés restent avec vous, ouvrez les portes !
Une idée observée chez Xebia, SFEIR et Octo, ainsi que chez d’autres entreprises : la personnalisation permet de conserver des talents. Il suffit d’aider certains de vos collaborateurs et de les encourager à prendre une place dans la communauté. Que ce soit en effectuant des présentations aux JUG, en les laissant blogger librement, en leur offrant des conférences ou en leur laissant un peu de temps pour un projet open-source : ouvrez les portes. Ne pensez pas que l’hyper-protection empêchera votre meilleur talent de partir.
J’ai lu les profils postés par les candidats sur l’eXpress-Board. Un des candidats a clairement dit : « moi dans mon entreprise je m’ennuie, elle ne m’offre pas de perspectives, j’ai envie de bouger ». C’est assez intéressant non ? Je m’ennuie, on fait rien d’intéressant à part boire du champagne avec les commerciaux chaque mois, ciao je m’en vais.
C’est pas avec 3 springles et une commerciale blonde avec des gros poumons que ton Geek de combat restera dans ta boîte. C’est avec des soirées « No SQL : Cassandra c’est chaud » qu’ils resteront, car ils auront le sentiment de bosser à plusieurs, et ils seront plus heureux. Tout simplement.
Idée 6 : nous ne sommes pas des ouvriers mais des artisans
Lorsque tu dis développeur à certaines personnes, on a l’impression de parler d’un animal élevé en captivité destiné à la reproduction de masse, et à même d’assurer une bonne reproduction avec d’autres compères.
J’ai le souvenir de cette jeune fille qui sortait avec un de mes amis. Diner de copains, elle m’explique qu’elle est chargée d’affaire. Je garde un silence sur mon métier, intéressé à l’idée d’écouter son point de vue sans l’influencer. Elle m’explique que son travail consiste à placer « ses ressources développeurs » et à s’assurer que les « TJM » sont correctement négociés. 3 développeurs .NET permettent d’assurer un ratio intéressant… Lorsqu’elle m’explique sa feuille Excel, j’ai l’impression de visualiser un poulailler d’élevage en masse…
J’aime mon métier. J’ai la vision d’un métier très artisanal, où les technologies tournent très vites. Qui utilisera encore <techo_pouet_pouet> dans 5 ans ? Cela nous force à ne pas nous endormir sur nos acquis. Nous sommes une profession qui n’a pas le temps de se professionnaliser. Regardez le succès des méthodes Agiles. Regardez la durée de vie des frameworks, elle est inférieure à 10 ans.
Je souhaite dire aux Boss que nous ne sommes pas des ressources. Nous devons passer 20 à 30% de notre temps en formation. Lire des blogs, tester des technologies, partir en formation, etc. Sans cela, nous serons en effet des ouvriers, facile à remplacer, sans valeurs ajoutés.
Et puis comme disait Guillaume, il n’y a que dans l’informatique que l’on traite les gens comme des gamins, alors qu’il s’agit de Cadre supérieur avec souvent 5 ans de formation derrière eux… Une affaire de respect sans doute.
Nous ne sommes pas des ouvriers mais de vrais Artisans.
Idée 7 : pour attirer d’autres candidats, cassez votre image
Cela semble évident mais il faut le dire : votre entreprise attirera les personnes qui vous ressemblent. Que ce soit consciemment ou non, l’image et les valeurs sont très importants. Le site internet fait un peu désuet. La nouvelle idée c’est d’utiliser Twitter. J’observe ce que font les entreprises de notre secteur, et pour l’instant il semble délicat de s’en servir. Les Blogs par contre sont devenus la pierre angulaire de toutes les entreprises technologiques. Il y a ceux qui en font une part importante de leur communication, en laissant les développeurs publier des articles. Il y a ceux qui contrôlent un peu plus. Et puis il y a toujours 2 ou 3 abrutis pour agréger les billets des blogs comme le Touilleur Express pour générer du traffic sur le site de #$%@… Mais je m’éloigne du sujet.
Cela revient sans doute à l’idée de personnalisation. Si votre entreprise est connue d’abord par le nom de l’un de vos développeurs, c’est un signe fort non ? Guillaume Bort, fondateur de Play! Framework, qui est ensuite le CTO de Zenexity… La personne est passée devant l’entreprise dans le réseau d’information des Geeks.
Idée 8,9,10…
Il y a d’autres idées, d’autres sujets à développer. Voilà quelques idées à tailler, argumenter, réfléchir.
J’aimerai présenter aux Boss un témoignage de Geek, d’un gars dans la communauté. J’ai le sondage, j’en ai lancé un deuxième (ci-dessous), j’ai rencontré des entreprises, bref il y a un TRUC à raconter.
Le Geek 2.0, un terme de Didier Girard. Il faut maintenant creuser et raconter cela.
NE PARTEZ PAS ce n’est pas terminé
Pour terminer, une question simple : si vous deviez changer de poste, quels seraient les 3 critères les plus importants ? Du plus important au moins important ? Allez, si vous répondez, vous verrez les réponses des autres.
RDV en juillet
Chargement en cours…
Saurez-vous aider l'exception à s'échapper de la Matrice ?
Mais attention, les Agents rôdent et vous repéreront si vous tentez de modifier la signature de la méthode getTheSpoon() ou la classe de test !
- public class Matrix {
- public static void getTheSpoon() {
- throw new NoSuchMethodException("There is no spoon !");
- }
- }
- public class Test {
- public static void main(String[] args) {
- try {
- Matrix.getTheSpoon();
- } catch (Exception ex) {
- System.out.println(ex instanceof java.lang.NoSuchMethodException ? "You passed the Quiz !" : "You failed !");
- }
- }
- }
Réponse : Plusieurs réponses sont possibles pour ce quiz, et la plupart ont été fournies dans les commentaires. Certaines étaient même très inventives et frôlaient la triche pure et simple :) Mais c'est ce qui fait l'intérêt de ces quiz, n'est-ce pas ? Ma préférée, que j'essayais de vous faire trouver, est celle qui détourne l'utilisation des... Lire Java Quiz #38
When it comes to application servers, 5 years is both a loooong time and probably also still the beginning of the story.
In June 2005, I wasn't yet part of the GlassFish team but I knew a number of people in the group and had been using Sun's application servers for the longest time. I had become excited again about Sun's plans when the decision to make the RI production quality was taken (Sun App Server 7 days).
Interestingly enough, the first one ever to blog about GlassFish was JBoss' Marc Fleury with a somewhat ironic "... who cares" post (two years later, he had some very nice things to say about the progress GlassFish had made). Only a few days after Marc's initial blog did the first posts from Sun come out: Jim's (could be considered as the announcement I guess), Carla's, John's, Rich's, Eduardo's, mine and others...
What makes me so confident about GlassFish is that it's all about the people that participate in the making of this community that is growing by the day. On a personal note, I traveled the world (Australia, China, Europe (too many to list), Bay Area, ...), did a first GlassFish screencast, started the GlassFish Podcast and always enjoyed the fun and excitement during releases of new version (and looking forward to the upcoming ones!).
Ever since I joined the group, I was told that v3 would be a game changer. So now we're finally there (and that we've got Java EE 6 out as well), I'm eager to find what the future holds. Onward!
Other anniversary blogs entries (James, Eduardo, ...) are listed on The Aquarium.