BodySplash.fr

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

mercredi 24 juin 2009

Structure et frameworks

Voilà un titre bien obscure. Alors de quoi allons parler aujourd'hui? De la manière la plus simple que je vois actuellement de commencer une application web en java. Il y a quelques semaines effectivement un ami me demandait finalement quoi utiliser pour démarrer un projet de 0 e, avec comme postulat de base que finalement, tout était bien compliqué. Je vais donc décrire ici mes environnements/outils/frameworks favoris qui à mon sens, permettent de s'en sortir dans la grand majorité des cas, et tout en fournissant une base à la fois solide et extensible.

L'environnement

Avant même de commencer à développer, mieux vaut savoir comment nous allons développer. Je pense maintenant qu'il y a une base indispensable à tout projet avant même de penser conception et développement.

Build

Avec quoi construire notre appli? Ca a l'air bête comme question, mais ce n'est en fait pas si simple dans le monde de java, ou tout n'est pas aussi intégré et monolithique que dans le monde .NET.

Par défaut, à peu prêt tout le monde utilisait Ant. Personnellement, je n'en peux plus: xml au kilomètre, dépendances gérées à la main, pas user friendly, bref, une horreur à mes yeux. Si vous lisez de temps en temps ce blog, vous devez vous douter que je vais proposer Maven. Avec maven, il va être possible en 2 lignes de xml d'avoir un projet entièrement compilé, testé, packagé. Les dépendances sont téléchargées depuis un entrepôt central, et il les gère en cascade, donc on ne passe plus des heures à linker ou mettre à jour les libs externes, c'est géré. Si on suit ses conventions, c'est bien simple maven permet de faire oublier une grande partie des tâches techniques de base d'un projet.

Une question qui peut venir et savoir comment organiser son projet dans maven: Multi module ou mono module? l'avantage du multi module est qu'il va garantir une séparation entre les couches, là ou le mono module si on ne fait pas attention peut entraîner un certain mélange. Ceci dit, la complexité du multi module au début ne compense pas ce risque hypothétique, et mieux vaut de toute manière enseigner qu'interdire. Donc, jusqu'à le projet atteigne une complexité trop importante, je préfère la simplicité du mono module tout en faisant attention à ne pas mélanger les couches.

SCM

Même si vous êtes seuls, il vous faut quelque chose pour conserver et versionner votre source, ne serait-ce que par sécurité et pour avoir la possibilité de revenir en arrière. Git a beau être une star montant, je ne le connais pas, et je vais donc me contenter de conseiller subversion: simple, efficace, et non intrusif (pas de lock par défaut sur les fichiers).

IDE

Certains puristes vont certainement dire qu'un éditeur de texte suffit pour développer, mais à mon avis, on est loin d'une productivité optimale. Voilà à mes yeux ce que doit ABSOLUMENT faire un IDE:

  • intégrer les test unitaires : pouvoir les lancer facilement, et naviguer rapidement dans le code incriminé par un test rouge,
  • refactoring : c'est à mon sens l'outil ultime de productivité et de qualité. Sans aides au refacto il est trop facile, par manque de courage ou de temps, de ne pas faire des changements pour clarifier le code. Pourquoi renommer une classe si ça nous prend 10mn de faire le tour de l'appli pour trouver ceux qui l'utilise? Pourquoi extraire une super classe et centraliser du comportement si c'est un long travail fastidieux de copier/coller? Voilà pourquoi je pense qu'il est juste indispensable qu'un IDE intègre un certain nombre de refactorings assistés
  • auto-complétion, coloration, indentation: c'est la base, mais il est bon de le rappeler
  • navigation rapide dans le code: il doit être possible d'ouvrir rapidement des types ou des fichiers, mais aussi depuis une classe par exemple d'aller directement dans le code d'un objet qu'elle inclue.

Il y aurait être d'autres choses à ajouter, mais c'est déjà pas mal. Les trois IDE les plus connus du monde java (Eclipse, NetBeans, Intellij Idea) assurent tous ces fonctionnalités en plus d'une intégration à Maven indispensable dans notre cas. Je ne vais pas rentrer dans des débats religieux sur lequel est le mieux, mais personnellement j'utilise Eclipse.

Intégration continue

Je pense que l'intégration continue doit être en place dans le premier jour du projet, il ne faut pas attendre de commencer à avoir des soucis pour la mettre en place. Le minimum est bien sur de compiler l'application et de faire tourner les tests.

Il existe maintenant pas mal de solutions gratuites, mais je dois avouer ma nette préférence pour Hudson, grâce à son esprit "on déploie et ça marche". C'est très simple à mettre en place, il marche très bien avec Maven, et il peut être étendu à souhait avec pas mal de plugins. Que demander de plus?

Les technos

Bien, nous avons la base pour commencer à développer, c'est bien, mais ça ne nous dit pas quels frameworks utiliser pour bâtir notre application web. Au risque de spoiler un petit peu, je vous annonce tout de suite que je ne vais pas conseiller JEE, même en version "simple" en n'utilisant que servlet/jsp.

Restlet

Voici un framework qui mériterait un billet à part entière, mais je vais essayer de faire un résumé. Le but de restlet est de servir de base pour produire et consommer des ressources conformément à l'approche Rest. Ce qui est bien avec ça, c'est que l'on peut commencer très simplement, en faisant une application "à l'ancienne" avec des pages html entièrement générées côté serveur, puis commencer à si on veut à faire plus du RIA, avec GWT, Flex, Dojo, peu importe, les ressources restent les mêmes, on négocie juste une représentation différente.

Comme je le disais, Restlet est très simple à mettre en place, pas besoin de conteneur de Servlet ou autre, il peut démarrer son propre serveur web en une seule ligne de code. Les ressources et la configuration se fait également entièrement dans le code, avec quelques recours très discret aux annotations. Bref, Restlet est une base idéale pour toute application web: il est multi-paradigme, peut grossir en même temps que votre application sans vous forcer une grande complexité dès le début, bref, je suis fan. Ah vous de choisir au début si vous voulez faire une application à l'ancienne, du GWT, du flex etc etc, Restlet supporte tout le monde de toute manière. Suivant ce que vous avez décidé, vous pouvez ensuite par exemple utiliser Freemarker ou Velocity pour générer la représentation html de vos ressource selon une approche MVC bien connue.

Hibernate

Ah voilà un choix plus discutable n'est-ce pas quand on cherche à définir les frameworks les plus simples pour démarrer n'est-ce pas? Le plus simple pourrait-on me dire, serait de directement se connecter à la base, et de faire nos requêtes. Le soucis avec cette approche, c'est que jamais elle ne sera capable de gérer correctement une grande complexité. On se retrouvera nécessairement avec du code mort, de la duplication et une très faible réutilisabilité du code. Ceci dit, il doit y avoir plus simple qu'Hibernate non pour accéder à nos données? Sûrement, mais là je vais devoir avouer que je suis complètement perverti par DDD, et je ne conçois pas de ne pas d'abord penser objet, tester, puis seulement ensuite de faire apparaître la base. Seul un mapper O/R par metadata mapping permet d'utiliser cette approche à 100% , et hibernate est la meilleure solution open source gratuite que je connaisse pour atteindre ce but. Ah mes yeux, et pour une fois, l'effort d'écrire et maintenir tout ce XML me semble complètement être compensé par la valeur: pouvoir écrire un modèle du domaine testable et indépendant de toute considération technique. Le point discutable est sans doute, dans le cadre d'une application juste CRUD, est-ce que ça vaut le coup de sortir l'artillerie lourde? Ma réponse habituelle est que je n'ai jamais connu en 7 ans d'applications qui faisaient simplement du CRUD, donc j'ai le sentiment que ce n'est pas la règle mais le cas particulier. De plus, comment savoir à l'avance que l'application ne fera QUE du CRUD quand on la commence?

Quelques remarques

Il y a bien entendu des critiques à émettre sur le choix des technologies de base, notamment sur la productivité. Il y a peu voir pas du tout de travail prémaché dans ce que j'ai proposé, pas de composants déjà utilisables rapidement, ou de scripts pour générer rapidement les "échafaudages", sans doute parce que je ne suis fan d'aucunes des technologies proposant ces options, car trop de choix me déplaisent dedans (Ruby on Rails et Grails sont très contraignants sur pas mal de points, tant ils font de choix pour nous, Wicket, JSF and co sont orientés composants et modèle par page et ne tirent pas partie à mon avis des avantages du web; Spring MVC est déjà plus sympa, surtout en version 3, mais c'est déjà beaucoup plus lourd que Restlet...)

mardi 24 mars 2009

La qualité, ça compte

Si vous lisez régulièrement ce blog, vous devez sans doute savoir que je développe depuis quelques mois maintenant dans un environnement full JEE5. J'ai eu l'opportunité tout d'abord de démarrer un projet de 0, puis de reprendre pas mal d'applications existantes.

Mon premier réflexe en commençant la nouvelle application, à part écrire un test, a été d'appliquer au moins les quelques patterns d'organisation de DDD, à savoir aggregate, entity et value object. J'ai pris tellement l'habitude de structurer mon domaine de cette manière que j'aurai d'ailleurs bien du mal à faire autrement. Bref, comme d'habitude ça a fonctionné et j'ai obtenu un modèle du domaine "taclant" correctement la complexité sans devenir illisible.

J'ai du ensuite reprendre d'anciennes applications également sous JEE donc, et je dois avouer que c'était la première fois que je m'essyais à cet exercice. Oui j'avais déjà travaillé sur des "brown fields", mais ils avaient tous en commun de s'appuyer intensivement sur la base et pas sur du "code". Du coup, ce que j'ai découvert en fait m'a "ouvert" les yeux encore plus sur l'intérêt des patterns décrit dans DDD. Car finalement, ce que j'ai eu à reprendre est globalement du code qui essayait d'utiliser les concepts EJB3, mais sans auncune structuration. Donc on se retrouve avec des DAO dans tous les sens, même pour récupérer des entités dépendantes d'une racine; on trouve carrément des références vers des ID plutôt que vers les entités réelles, des références croisées dans tous les sens, bref, je me suis retrouvé face à ce que tout que les concepts d'aggregate/entity/value objet essayent d'empêcher, tous ces problèmes qui font croire à pas mal de gens que l'objet, c'est imbitable.

Bilan de cette histoire:

  • et d'une, il y a toujours des choses à prendre dans DDD,
  • de deux, avant d'entrer dans des systèmes aussi complexes que peuvent être les différents serveurs JEE, et se vanter de faire des supers architectures , il faudrait se concentrer sur qui compte réellement : le code. Je ne veux pas faire une généralité de cette règle, mais je ne compte pas le nombre de tutoriaux/messages de forum/newsgroup etc etc ou j'ai pu constater ce phénomène de "branlette sur l'architecture" alors que le code montré en exemple était tout simplement dégueulasse.

L'architecture n'est pas un paliatif à du code de piètre qualité.

vendredi 13 février 2009

Domain Driven Design France aka DDDFrance

Ça va faire presque un an que Fabien et moi avions commencé à parler de ce projet suite aux différents échanges qui ont suivi la présentation de DDD de Sami Jaber pendant le Symposium DNG.

Avec beaucoup de retard, la participation d'autres amis et un contenu bien en deçà de ce que nous avions prévu, j'ai la joie de vous annoncer l'ouverture officielle de DDDFrance.org.

Oui le site n'est pas réellement fini, et il lui manque à mon avis le contenu minimum. Nous avons sans doute à la fois manqué de temps et d'énergie, mais ce billet sur le blog de Xebia nous a convaincu qu'il ne fallait plus tarder.

Je vous laisse découvrir le site. Je dirai juste que ce n'est pas pour rien que c'est un wiki, et que la force future et hypothétique de ce site sera sa communauté. Ou pas.

jeudi 12 février 2009

Comment juger un développeur?

La question est classique, mais le débat est revenu plusieurs fois ces dernières semaines ou moi au d'autres collègues avons du faire passer quelques entretiens. C'est une question bien entendu très ouverte, donc je vous laisse vous défouler dans les commentaires :)

Très personnellement, je ne pense pas que l'on puisse juger quelqu'un à la somme de ses connaissances. Mieux vaut une tête bien faite qu'une tête bien pleine comme disait l'autre. Donc, contrairement à ce qu'on pourrait penser, même si par curiosité je vais demander, je ne vais pas attendre de quelqu'un qu'il sache tout de l'agilité, des principes SOLID, de DDD etc. etc. Je vais sans doute me moquer encore plus des connaissances encore plus techniques comme les détails d'mplémentation de tomcat ou ses différents connecteurs. Mais alors qu'est-ce qui importe? Ce qui importe, c'est que tous les éléments que je viens de citer peuvent s'apprendre. C'est donc mon premier grand point: savoir et vouloir apprendre.

Ensuite, à mon sens ce qui fait le plus la qualité d'un développeur c'est la qualité de son code. Oh la belle phrase. Qu'est-ce que ça veut dire? Essentiellement pour moi qu'il est maintenable. Comment rend on le code maintenable? Essentiellement en lui donnant du sens. Ca a peut être l'air tout con comme ça, mais j'ai très personnellement le sentiment qu'en France le code est très mal vue, et que globalement la grande majorité des formations que nous recevons sont à base de "le code c'est le mal, mais plus tard vous serez chef de projet et vous en ferez plus". A partir de là pourquoi dépenser des efforts dans quelque chose qui est apparemment par définition imbitable et chiant?

Mais je digresse, pour résumer en deux principes, voilà finalement ce que je recherche:

  • amélioration continue
  • donner du sens au code

Ce qui me plaît dans ces deux principes, c'est qu'ils permettent de juger tant les débutants que les vieux routiers. Une fois que ces deux qualités sont identifiées, il suffit d'estimer "l'avancement" sur le chemin. Par exemple, donner du sens au code commence par bien nommer ses variables, et continue (bien) plus tard par DDD.

mardi 3 février 2009

JPAHAHAHA

Ceci est dans la continuité de ce que je disais sur EJB 3. Je continue ma découverte de ce petit monde EJB 3/JPA, et mon sentiment pour conclure est que pour faire cette norme, il a suffit de prendre hibernate, et de lui enlever tous les concepts qui faisaient qu'il supportait relativement facilement DDD

Non content donc de ne pas supporter les collections de types primitifs ou de composants, en plus JPA ne supporte pas le delete-orphan. Leur super conseil à ce niveau là est donc de dire "bah appelez un session.remove(childASupprimer)". Il faudra sans doute leur faire savoir que tout le monde ne fait pas des transactions scripts, et que certains d'entre nous aimeraient pouvoir faire confiance au mappeur O/R pour synchroniser de manière transparente leur modèle du domaine. Du coup je me retrouve obligé d'exposer dans mon entrepôt d'objets parents une méthode pour supprimer les fils. Adieu persistence ignorance.

mardi 20 janvier 2009

norme EJB 3, je te hais

Bon avec un titre pareil, je pense que vous m'avez déjà compris.

Ca va faire un mois que je travaille sur un projet s'appuyant lourdement sur la norme JEE 5. J'étais pourtant parti d'un bon pied, en me disant qu'il était de toute manière possible de faire de bonnes choses avec. Le soucis, c'est que je vais de frustration en frustration, et notamment au niveau mapping O/R. Même si JBoss est le serveur d'application utilisé, et que donc, le persistence est assurée par Hibernate, la directive d'architecture est de ne se baser que sur la spécificaiton EJB 3 pour pouvoir déployer sur n'importe quel serveur. Le soucis de cette spec, c'est qu'elle est incroyablement limitée comparée aux possibilités d'hibernate.

Je ne vais pas tenter une liste exhaustive, mais voici quelques une de mes plus grandes frustration:

  • Pas d'API de requête, tout doit passer par EJB QL. Tant pis pour la génération de requête générique et l'intégration aux outils de refactoring.
  • Par défaut, utilise les annotations pour définir le mapping, cassant à mon sens le concept de Persistence ignorance,
  • Ces fameuses annotations sont beaucoup moins intuitives qu'Hibernate
  • Si jamais on veut se passer des annotations, par défaut il faut mettre le mapping dans un seul gros fichier xml bien boulimique. Très surprenant quand on sait que JBoss supporte tout à fait la détection à la volé de tout ce qui est *.hbm.xml
  • La norme ne supporte pas les collections de types primitifs ou de composants, et là, c'est juste inadmissible. Oui, pas de collection de String par exemple dans vos objets, interdit ça.

mercredi 30 avril 2008

Spring

Ah voilà quelques temps que je n'avais pas parlé du projet n'est-ce pas? Et bien il est temps de corriger cette erreur avec un petit billet rapide.

Lire la suite...

mardi 22 avril 2008

Démonstration

En me documentant sur Sping MVC, je suis bien entendu tombé sur le tutorial "official", contenant entre autre ça.

C'est tellement une illustration de ce que je disais il y a quelques temps que ça en est presque risible.

Alors pour résumer, je trouve assez fantastique qu'en un seul petit exemple simpliste on réussisse à voir apparaitre

  • un modèle du domaine anémique
  • des DTO portés au rang d'objet métier servant de cœur au système
  • une conception procédurale: le service héberge les traitements de A jusqu'à Z
  • de la surcomplexification: utilisation d'une interface implémentée une seule fois, couche de service inutile dans le contexte.

Je sais, ces éléments sont plus ou moins liés, mais laissez-moi être un peu théâtrale.

Bref, je le répète, une magnifique démonstration de ce que je n'aime pas voir dans un projet et que pourtant, je croise à chaque coin de rue.

mardi 8 avril 2008

Linq

Je disais en février que j'avais un peu de mal encore à voir comment utiliser Linq. Depuis, de l'eau a un peu coulé sous les ponts, et des articles intéressants ont commencé à voir le jour à droite à gauche donnant une orientation intéressante à cette techno. A mon tour donc d'y aller de ma participation.

Lire la suite...

mercredi 2 avril 2008

Chose promise...

Voilà quelque temps, j'ai promis à quelqu'un je ne nommerai pas (mais il se reconnaîtra j'en suis sur) de faire un billet/article sur entity framewok.

Lire la suite...

dimanche 17 février 2008

Nested factory

Je ne sais pas si on peut parler de pattern, mais en jouant avec les concepts DDD sur un projet en cours, nous sommes tombés Fabien, Michael et moi sur un pattern intéressant: la nested factory. Je vous laisse découvrir les détails ici

jeudi 14 février 2008

Symposium DNG - Entity Framework et Linq

Le lecteur attentif aura sans doute remarqué que j'ai sauté la conférence sur Volta dans l'ordre de mes billets. Pourquoi? Parce que la techno étant très jeune je ne suis pas sur de pouvoir faire beaucoup de commentaires intéressants dessus, et du coup Fabien à dit à peu prêt tout ce qu'il y avait à dire sur le sujet

Lire la suite...

lundi 14 janvier 2008

Domain model, séparation des couches: le grand mélange

NOTE DU 30/01/2009: Je vois que vous êtes assez nombreux à faire une recherche sur domain model sur google et à tomber sur mon blog. Si vous cherchez des informations sur le sujet, nous créons doucement avec des amis ddd france. Nous comptons beaucoup sur la participation de la communauté pour le faire avancer, donc n'hésitez pas à laisser une trace.
Je vous laisse maintenant lire le billet original.


Bon ce message va sans doute faire partie de la grande série "je me crois assez fort pour corriger la terre entière"; mais je sais mes lecteurs très tolérant vis à vis de mon égo démesuré :)

De quoi vais-je causer? Et bien tout est dans le titre pratiquement. Domain model et séparation des couches, sont des termes très à la mode que l'on rencontre de nos jours aux quatre coins du web.
Je devrais être heureux, mais je remarque souvent qu'ils ont l'air bien mal employé.

Lire la suite...

lundi 5 novembre 2007

Critiquons, critiquons

J'ai pas mal de billets un peu trop ambitieux qui trainent à l'état de brouillon, donc pour donner une illusion d'activité, je vais donner rapidement les problèmes que j'ai pu croiser en utilisant quotidiennement depuis mal de temps ASP.NET.

Lire la suite...

vendredi 22 juin 2007

8 fois plus de code

Pour différentes raisons, pour le projet en cours j'ai du écrire la mapping à la main plutôt que d'utiliser une solution comme nhibernate.
Au final, la dll contenant mon domaine pèse 100ko, et la dll contenant le mapping quant à elle pèse 800ko. 8 fois plus de code donc nécessaire pour faire persister un domaine. Je dois dire que j'écris ce message à la manière d'une dépêche AFP car finalement, je ne sais pas trop comment commenter ce ratio si ce n'est en disant "ah ouais, quand même".

PS: ceci n'est pas une remise en question de l'approche par domaine, mais juste un constat assez amusant que je voulais partager avec un très hypothétique lecteur... qui d'ailleurs ne peut même pas répondre car j'ai coupé les commentaires et les trackbacks pour stoper l'hémoragie des spams qui pourrissaient ce blog.

jeudi 17 mai 2007

Grrrrr

Voilà quelques temps déjà que je traine mes guêtres dans le milieu de .Net, et par extension, du moins c'est ce que je pensais, de l'objet.

Lire la suite...

vendredi 5 janvier 2007

Orienté objet

tout le monde en parle depuis des années, mais mon maigre constat est que finalement, dans le monde de l'entreprise, le combat est loin d'être gagné.

Lire la suite...