.NET ou Java ?

11 10 2006

Désolé pour ces deux semaines d’absence, je manque cruellement de temps ces derniers jours…

Très souvent lors des formations que j’anime vient la question fatale :

Alors c’est lequel le mieux, Java ou .NET ?

Sur mes quelques années d’expérience dans ces deux langages j’ai appris à formuler une réponse à laquelle je crois : ça depend.

Dis comme cela, on pourrait croire que j’évite la question mais au contraire l’expérience m’a montré que le choix d’une technologie ne doit jamais se faire à la simple comparaison d’un tableau de fonctionnalités.

Par exemple en Java, on peut utiliser des paramètres variables avec « … » alors qu’on ne peut pas en C#. Donc Java est mieux !

Ah mais en .NET, on dispose du système puissant des « delegates ».

Donc c’est .NET le mieux ? Il faut voir également que pour les frameworks d’accès aux bases de données, on retrouve en Java un excellent connecteur JDBC indépendant de la base alors qu’en .NET, ADO.NET 2 n’est pas encore au niveau…

Bref, sans rentrer dans les considérations techniques, on voit bien que cette comparaison est sans fin mais qu’elle est surtout inutile.

Car, par exemple, qui s’intéresse à une comparaison avancée sur la mobilité entre le compact .NET et J2ME si l’on développe une application client lourd windows ?

Ainsi, j’ai pris l’habitude de répondre à la question « .NET ou Java » en retournant la question. Pour cela, j’ai généralement une petite liste de questions qui sont autant d’indications qui me permettront de conseiller au mieux un choix technologique.

Exemple de liste des questions :

  • Quelle est l’expérience de vos développeurs ?
  • Quel est l’existant matériel/logiciel ?
  • Quelles sont les directives de la DSI ?
  • Quelles sont les types de projets ?

En cernant au mieux le profil de l’équipe, la réponse apparaitra d’elle-même.

Voici ma vision rationnelle du choix d’une technologie. Quand à imposer un langage auprès d’une équipe, le travail n’est jamais gagné car après tout, le développement est une religion 😉



Idées sur la Easy Gate

22 09 2006

Jusqu’à aujourd’hui, quand un FAI veut nous vendre son offre, son discours est généralement orienté dans ce sens :


  1. Je vous vend un abonnement Internet pour XX d’euros.
  2. Et en plus gratuitement le téléphone !
  3. Et en plus plus, gratuitement la télévision !

Bref, le message est orienté vers un usager qui souhaite d’abord accéder à Internet et à qui on offre plus par rapport à la concurrence.

Neuf Telecom vient d’annoncer un nouvel abonnement Easy Neuf avec en location un ordinateur/routeur Easy Gate. Cette fois, à la place d’un simple modem ADSL, c’est un ordinateur autonome et simple d’utilisation. Clubic en parle en détail avec des photos.

Je pense que Neuf Telecom possède ici un avantage sur ses concurrents dans la mesure où pour une fois, le discours pourrait très bien être inversé :

  1. Pour XX euros/mois, vous avez le téléphone illimité et la télévision/TNT
  2. et pour à peine 10E de plus, je vous prête un mini-PC qui permet d’aller sur Internet

Avec comme cible, 50% de la population non encore connectée et n’ayant pas l’envie ou les compétences pour se mettre à l’Informatique avec un grand I. Cela englobe tous les néophytes curieux de voir enfin à quoi ça ressemble ce fameux truc Internet dont on entend parler au journal de 20H…

Je suis donc impatient de voir avec quelle formule Neuf va marketer ce produit 😉



Clés techniques et clés d’état

19 09 2006

update: remarques en fin d’article

Je suis partisan d’une simplification des tables avec une clé primaire non métier. Ce que l’on nomme généralement clé primaire technique sous forme d’un entier auto-incrementé, c’est mon coté rails qui parle là.

Mais concernant la définition des états je desteste me retrouver avec des entiers de 1 à X décrivant chacun une étape. Exemple :

1 -> Initialisation 2 -> En cours 3 -> Fin traitement OK 4 -> Fin traitement KO 5 -> Stockage 6 -> Sortie

Le gros problème de ce genre d’états est qu’il difficile pour l’esprit humain de garder la correspondance en tête. Surtout quand on se retrouve avec une dizaine de listes différentes comme ceci.

Si l’on prend des données lambda en base utilisant le système précédent, voici ce que l’on pourrait voir dans la base de données :

|   DONNEE  |   ETAT  | |===========|=========| |  entree1  |    1    | |  entree2  |    3    | |  entree3  |    5    | |  entree4  |    2    |

Résultat, on passe son temps à se demander quelle est déjà l’étape correspondante. J’aimerais avoir une façon plus lisible de comprendre ces éléments sans devoir me référer à une autre table ou retrouver dans mon code les différentes implémentations.

Par exemple je trouve ceci plus lisible :

|   DONNEE  |   ETAT  | |===========|=========| |  entree1  |  INIT   | |  entree2  |  T OK   | |  entree3  |  T KO   | |  entree4  |  ENCO   |

Mais j’ai bien conscience que d’une part ce n’est peut-être pas vraiment optimisé car on passe d’une colonne d’entiers à une colonne de caractères (Problème d’index et compagnie) et d’autre part, ca fait un peu charabia cet état sur 4 caractères.

D’autres propositions ?

update: Suite aux commentaires éclairés de Yann (Pas de blog à linker…bientôt ?), je crois que ma refléxion part d’un postulat incorrect. En effet, je base ma réflexion sur un existant où l’on retrouve dans une table des états de 1 à 6. Ces états ne sont pas des clés étrangères pointant vers une table de référence des états et je crois que mon erreur vient de là. Je cherche à résoudre un problème qui n’est pas, et sa résolution est seulement l’affaire d’un travail d’amélioration de la base de données existante.



Struts2 arrive…

19 09 2006

Etant donné la popularité du framework Struts encore aujourd’hui, je pense qu’il est vraiment bon pour le CV de se former et d’être prêt pour la sortie de la version 2 du framework.

En effet, je ne serais pas étonné de voir le buzz monter lors de la sortie de struts2 et de voir aussi les décideurs et chefs informatiques (ceux qui lisent le 01 😉 ) se dirent :

Tiens la version 2 de notre framework préféré, chouette. On migre !

(un DSI dit souvent chouette, c’est connu 😉 )

Tout ça pour conclure, prenez de l’avance : Converting to Struts2 – Part I



Comment devenir programmeur

18 09 2006

Vu sur secretgeek, voici le secret que tous les développeurs connaissent :

   intellisense        
	||        
	\/       
	code >>> compile >>>>> run >>>> success :-)        
	/\         ||          ||        
	^^         \/          \/        
	^^      errors       errors        
	^^          \\       //        
	^^           \\     //        
	^^             google        
	^^              ||        
	\\              \/         
	\<<<<<<<  cut N paste

Maintenant que vous savez, gardez-le pour vous et abusez en 😉



C’est beau…

3 09 2006

Et oui que c’est beau, et d’une sobreté tout à faite classieuse.

Le lien pour participer à cette béta : Firefox 2 beta 2

J’aimerais participer à ce béta test et poster des bugs mais la stabilité du soft est impressionnante en utilisation principale…



Guide pour la gestion des exceptions

30 08 2006

Cet article marche pour tout langage objet, mes lecteurs ruby, .net, java et php peuvent donc lire 😉 . Je ne parlerais ici que des exceptions non checkés car ce sont aujourd’hui les exceptions les plus répandues (et les checkés n’existent pas en .net…)

La gestion des exceptions est problématique c’est un fait. Qu’on soit développeur débutant ou confirmé, au moment de traiter une exception on se pose toujours les mêmes questions :

  • Est-ce que je l’attrape ou je la laisse remonter ?
  • Qu’est ce que je met dans le finally ?
  • Est-ce que je l’encapsule ?

Évidemment comme tout problème complexe, il n’y a pas de réponse définitive et tout est question de contexte. Pour ma part, j’applique une méthode qui, à défaut d’être complète, me permet d’évaluer rapidement dans quel contexte je suis et de décider de la solution à apporter.

1. Algorithme de décision

La première question que je me pose lors de l’appel d’un code qui risque de lever une exception est : Qu’est-ce que mon programme doit faire si l’exception arrive ?

La réponse à cette question tombera toujours dans deux catégories :

* J’ai une réponse de substitution et le programme peut continuer.

Par exemple, si j’ai une exception lors de la génération d’une couleur, j’ai prévu dans les spécifications de prendre une couleur par défaut. Dans ce cas, on pourra écrire ceci :

try {  couleur = GenerationCouleur() } catch( GenException ) {   couleur = CouleurParDefaut }

Attention dans ce cas à n’attraper que l’exception dont j’avais prévu la substitution et non un vilain catch( Exception ).

* Je n’ai pas de reprise particulière au problème.

L’exemple le plus commun est un plantage de l’accès à la base de données. Si je suis en train d’enregistrer un nouvel utilisateur et que mon accès sql se met en vrac, il est évident que je n’aurais aucun moyen de contournement pour terminer correctement mon action.

L’idée est donc d’admettre qu’on ne peut rien faire et de laisser remonter l’exception. De cette façon, l’exception va remonter les couches d’appels jusqu’à un appelant qui lui aura une réponse à apporter. Dans le cas d’une application web, il est commun que le seul qui aura une réponse à apporter sera le conteneur web (la brique la plus haute) qui affichera une jolie page d’erreur et s’occupera de logger tout ça…

2. Rethrow

Un autre type de code que l’on voit souvent :

try {   ... } catch( Exception ex) }    throw new MonException(ex) }

Ma prise de position sur ce sujet est qu’il faut éviter de catcher pour rien. En effet, quelle est la valeur ajoutée par la ligne ci-dessus ?

Cela ne fait qu’ajouter une indirection dans la cause réelle de l’erreur et provoque donc plus de travail pour le développeur qui doit comprendre ce qui s’est passé. Des stacktraces de 3 kms de long ne sont jamais agréables à lire…

La seule exception (je ne sais pas si le mot est bien choisi) est le développement d’un librairie ou d’un composant tiers. Dans ce cas effectivement, il sera plus propre de cacher les exceptions internes avec des jolis exceptions car la séparation est claire.

3. Fail fast

L’argument en faveur d’un ciblage précis des exceptions à attraper est le fail fast. L’idée du Fail fast est de provoquer un plantage quand une exception incontrôlée survient dans le but d’assainir le programme. En effet, il arrive souvent qu’on soit tenté d’avaler les exceptions avec du joli code comme ceci :

try {   ... } catch( Exception ) { // Toutes les exceptions  // on ne fait rien. On AVALE }

Et bien c’est MAL ! En effet, sur le moment effectivement si une erreur survient le client est content car son application n’affiche pas d’erreur et il peut continuer en apparence. Mais en réalité, le programme vient de basculer dans un état incohérent où l’état des objets en mémoire n’est plus garantie.

Résultat, on se retrouve avec un client qui se plaint d’avoir un message d’erreur 3 pages plus loin et alors là vient le courageux développeur qui va mettre 2 jours à comprendre le pourquoi du comment de l’erreur !

Dans le paradis du Fail Fast, le client serait tombé directement sur une page d’erreur au premier coup, il aurait pris son téléphone pour gueuler (dans les 2 cas il gueule car ça ne marche pas de toute façon 🙂 ) et hop corrigé en 15 mins, car effectivement c’était une mauvaise idée de caster cet objet de classe Personne en classe Agenda… (On sent le vécu)

4. Et le legacy ?

Le fail fast est une bonne idée sur les nouveaux développements mais que peut-on faire sur sur un applicatif existant -legacy- miné d’avaleuses (ne cherchez pas à visualiser) ?

Une mauvaise idée serait d’enlever tous les catchs {} vides car le client se retrouverait avec des erreurs sur des parties qui marchaient auparavant et ne comprendrait pas en quoi c’est mieux qu’avant. Ma proposition est plutôt d’ajouter dans tous les catchs un simple log. Par exemple :

catch (Exception ex) {   log.error(ex) }

Ainsi on pourra surveiller le comportemant du legacy et detecter les points d’erreurs qui n’étaient pas visibles avant. L’objectif étant évidemment de corriger le source au fur et à mesure de la détection de ces erreurs. Concernant les évolutions du programme, aucune pitié, on fail fast !

5. Conclusion

Le tour des rapide mais j’espère qu’il servira à enlever quelques ambiguités sur la réflexion que l’on porte aux exceptions.

Comme le sujet porte à débat, j’espère avoir des jolis commentaires sur ce post 🙂



Parlez-vous WOW ?

29 08 2006

Vu dans un commentaire sur le blog Cafzone :

 »En même temps, les démos en raid PVE VHL sont carément largués en terme de dps. Suffit de voir les SwStats de AQ et Naxx pour se marrer un bon coup :p (je suis mage :p) »

Je vous rassure, moi non plus je ne comprend pas 😉

Il faut dire que je ne joue pas à World Of Warcraft

J’avais essayé il y a quelques temps de me lancer dans Anarchy Online, mais j’ai très vite compris que ces jeux sont trop chronophages et je préfère me rabattre donc sur des jeux ayant un début et surtout une fin !



La Toolbox du développeur

25 08 2006

La productivité est un saint-graal pour tout développeur.

En dehors du fanatisme classique qui consiste à vouloir tout tester et toujours en dernière version (vive les versions beta), il peut tout de même être intéressant de se constituer une Toolbox sérieuse et pratique.

J’ai donc pris l’habitude au fil du temps de me monter une Toolbox ou boite à outils en bon francais.

Je vois trop souvent des développeurs se contenter des outils standards fournis avec l’OS pour travailler en dehors de l’IDE. Un exemple flagrant est l’éditeur de texte Notepad. Cet outil est dépassé depuis longtemps.

Notepad2 pour le même prix (c’est à dire gratuit) offre la prise en compte des CL/RF (les retours chariot), la colorisation suivant le format, la prise en compte complète de l’encoding, etc.

La référence du genre est la Scott Hanselman’s 2005 Ultimate Developer and Power Users Tool List. Cette liste est fortement orientée pour les développeurs .NET mais on y retrouve Notepad2 qui est pratique pour tous.

Si vous voulez avancer plus loin dans le sujet, Wrox offre sur son site web des vidéos  »toujours de Scott Hanselman » qui nous montre ses nombreux secrets de productivité et d’outils. On peut le voir en action et c’est impressionnant. C’est un « tueur » dans son genre et malgré ma relative longue expérience sur les environnements Windows, j’ai appris des nouvelles commandes sous la console MS-DOS !

Bonne chasse aux outils !

Update : C’est tout chaud : Scott Hanselman’s 2006 Ultimate Developer and Power Users Tool List for Windows et c’est toujours aussi intéressant…



Nouveau blog technique à suivre : Le Danois

22 08 2006

Je suis ravi de constater que mon danois préféré (non ce n’est pas AQUA !) revient sur la blogging-scene après quelques mois d’absence.

Qui dit retour de nos jours dit 2.0 et il n’échappe pas à la règle. Rassurez vous, il ne revient pas en version Bêta 😉 .

Il y parle technologies de l’informatique et nouveautés du Web avec une grande ouverture d’esprit et un avis juste et souvent pertinent.

Le Danois 2.0

A vos flux. (comment on dit bookmarker en RSS?)