Olivier Dahan

Microsoft MVP Silverlight 2013, 2012,
2011, MVP CAD 2010, MVP C# 2009


Membre du Developer Guidance Advisory Council Microsoft

Audit, Conseil, Formation, Développement
[WPF, Silverlight, WinRT, MonoDroid]

Historique

Gérer les changements de propriétés (Silverlight, WPF, WinRT...)

S’il y a bien une chose qui est “ze” base de la programmation sous .NET quel que soit la technologie d’affichage, c’est bien la notification des changements de valeur des propriétés ! Bizarrement cette fonctionnalité cruciale sur laquelle tout DAL, tout BOL, tout modèle Entity Framework se base, sans lequel MVVM n’existerait pas, ni Prism, ni Jounce, ni rien, bizarrement disais-je, Microsoft n’a jamais rien fait pour l’améliorer, laissant chacun se débrouiller et bricoler sa solution !More...

Intégrité bi-directionnelle. Utiliser IEnumerable et des propriétés read-only (C#)

Un peu de C#, ça faisait longtemps que je n’avais pas bloggé sur le sujet. Aujourd’hui quelques points essentiels dans la conception des classes…More...

Le retour du spaghetti vengeur

Le code spaghetti est de retour ! Fuyez braves gens !

Sous-titré : Du Rififi dans le Xaml.

Avertissement au lecteur : ce billet, bien que bâti sur un fond technique préoccupant et une expérience réelle, utilise un formalisme un peu romancé. Ne cherchez pas d’extraits de code ici. Mais si vous avez un peu de temps, laissez vous porter par l’histoire. Si vous êtes pressés, revenez plus tard lire ce billet !

Genèse d’un malaise

Comme vous le savez je suis un passionné de WPF et de Silverlight, la puissance de Xaml servi par un Framework aussi riche que .NET et des outils de qualité comme Blend ou Visual Studio ne peuvent laisser de marbre (comment peut-il y avoir encore des gens travaillant sous Java ou Delphi ?). J’en suis tellement passionné que j’évangélise à tour de bras, ici et ailleurs, et que mes compétences autant techniques que de gardien des brebis égarées me valent d’avoir l’honneur d’être Microsoft MVP, notamment en 2010 pour les technologies de développement d’applications clientes (Client Application Development, “CAD”" MVP).

Bref, si je dis tout cela c’est pour faire comprendre que bien que cultivant mon objectivité comme un joyau précieux garant de la liberté de mes neurones, je suis plutôt “pro” Microsoft et que, bien entendu, cela peut déplaire à certains comme en séduire d’autres… La diversité du monde en fait sa richesse, isn’t it.

Et un partisan de Microsoft, MVP de surcroît, fan de Silverlight, ne dira jamais le moindre mal de sa technologie fétiche… Et soyez-en convaincu je ne briserai pas cette loyauté, essentielle à mes yeux, mais il faut pourtant savoir tirer les sonnettes d’alarme de temps en temps. D’ailleurs c’est une question de crédibilité, que vaudrait un expert sans liberté de parole ni de pensée… Et puis au fond vous verrez que c’est bien plus, comme à chaque fois, l’humain qui en prend pour son grade dans ce récit que les outils, innocents, par nature.

Tout cela pour parler franchement d’un risque, d’une dérive, et surtout d’un grand danger : le retour du code spaghetti ! Et, comble de l’infamie, la peur de cette tare qu’on croyait du passé, je ne la brandis pas à propos de langages ésotériques comme F#, ou de solutions vieillissantes comme Java. Non. Le drame est bien là : c’est de WPF et de Silverlight dont je veux vous entretenir, et ce, au travers d’une anecdote récente.

J’ai fait il y a quelques temps un audit dont je tairais, vous le comprendrez aisément, le nom du client visité ainsi que la date exacte. Au demeurant une société ni trop jeune pour n’être pas assez structurée, ni trop vieille pour en être devenue ringarde. Une entreprise de bonne taille, assez dynamique et assez typique de ma clientèle, se targuant de posséder une équipe de développement à la pointe du progrès, la preuve, puisque maniant les balises Xaml avec la même dextérité que la truelle l’est par un vrai maçon diplômé.

Le trait n’est pas forcé, il n’y en a nul besoin. Ce fut au début un audit “classique” c’est à dire durant lequel j’ai vu du code “normal” donc assez médiocre. Je dis “normal” au sens de la loi normale statistique ce qui signifie que grâce à  messieurs Laplace et Gauss il m’arrive de voir des choses épouvantables comme de pures merveilles, mais que ces deux cas représentent un pourcentage faible au deux bouts de la cloche… Je ne savais pas encore que j’allais atteindre le bout de la cloche. Le mauvais. Bien entendu.

Espèce de spaghetti !

Le code “normal” est médiocre généralement. C’est finalement une définition en soi. Le code exceptionnel, étant, par le même genre de raisonnement, plus rare. C’est finalement une lapalissade. Donc, en général, je vois du code médiocre, donc normal (dans l’autre sens c’est intéressant aussi, non ?).

Et j’appelle médiocre un code qui se caractérise par plusieurs aspects distinctifs très techniques que je détaille avec moult délicatesse dans mes rapports d’audit pour expliquer les choses en y mettant les formes mais qui se résument en général à quelques cas généraux qu’on pourrait caractériser très doctement. Je m’exprimerais ici de façon bien plus directe puisqu’on est “entre nous” :

  •  
    • La “putain” c’est à dire le code sur lequel tout le monde est passé, sauf le train et vous, mais ça, c’est même pas sûr, puisque vous êtes là… C’est du code typique des boîtes où les gens sont mal payé et où les salariés défilent plus vite qu’une hirondelle dans un ciel de printemps…
    • Les migrations de migrations de portage d’intégration (de milles sabords, version 24 bis modifiée E). En général du code qu’on trouve dans les administrations. Avec des documentations de plusieurs centaines de pages, que personne n’a jamais lu bien entendu.
    • Le code mille-feuille. Savoureuse pâtisserie constituée de tant de couches qu’on ne peut les compter, comme les pattes du iule (autrement appelé mille-pattes). C’est un peu un mélange des deux précédents mais en plus structuré que le premier (beaucoup plus, et c’est la son problème) et en moins documenté que le second (beaucoup moins, et c’est aussi là son problème). C’est du code de SSII “in” avec de vrais morceaux de “nouvelles technos” dedans.
    • Le code “start-up”, celui-là est bourré de technos innovantes, hélas non maîtrisées, peu documentées et en bêta ne tournant que sur les versions US de l’environnement. Un code d’essayiste pur travaillant pour la beauté du discours qui va autour plus que pour l’efficacité, des gens qui devraient être en agence de pub plutôt que devant un environnement de développement.
    • Le code à papa, ou l’objet est utilisé comme du C procédural. C’est le code C# écrit par de vieux delphistes ou cobolistes reconvertis sur le tard par exemple.
    • Le code d’ingénieur, un des pires. Sortant de l’école et voulant montrer ses muscles en complexifiant tout et l’enrobant dans une prose technique pleine de sigles bizarres et de référence à des bouquins lus de lui seul et de ses potes de promo. Quand il arrêtera de sucer son pouce, il deviendra un bon développeur sévèrement burné comme disait Tapie. Mais en attendant son code c’est l’enfer…
    • Et enfin, le célèbre, le magnifique, le code spaghetti, marquant l’incompétence à maîtriser la complexité du sujet. Celui-là est typique des mauvaises équipes, tous contextes confondus.

Il y en a bien d’autres dans mon bestiaire, en 20 ans d’audit vous imaginez ce que j’ai pu voir (heureusement je rencontre aussi des équipes compétences et même parfois de l’excellent code, sinon ça serait désespérant !).

Et WPF et Silverlight dans tout ça ?

C’est là que je voulais en venir, mais il fallait bien passer par ce détour pour vous plonger dans l’ambiance trouble de cette descente aux enfers binaires. Sinon cela aurait été d’une platitude redoutable. Un peu de lecture ça change des extraits de code en Xaml. Justement. Parlons de lui et de ce dernier audit (qui n’est pas le dernier, confidentialité oblige comme je le disais plus haut). Disons que c’est assez récent pour être en Xaml mais pas suffisamment pour être en Silverlight 3.

Qu’avait ce code qui vaille ce billet un peu particulier ?

Le code qui rend fou

il m’a rendu fou. Tout simplement ! Et en plus il m’a filé les chocottes !

WPF et Silverlight sont des technologies merveilleuses, Xaml a un pouvoir descriptif exceptionnel à tel point qu’il permet d’économiser beaucoup de code behind.

Malgré le génie des équipes MS ayant travaillé sur le Framework j’aurais malgré tout préféré que cette révolution se fasse à 100% dans le respect du paradigme objet et du fortement typé. Or ce ne fut pas totalement le cas, et si je comprends bien les contraintes techniques sous-jacentes qui ont interdit cet idéal, certains choix sont hélas autant de portes ouvertes sur des risques que je viens de palper de près. Et ça fait peur.

Il y a en premier lieu l’architecture. Il ne suffit pas de prendre Prism et ses Dll pour avoir un bon logiciel. Il faut comprendre et maîtriser la chose. Ce qui ne s’improvise pas. Mais il y a pire, car plus lié à la technologie elle-même.

Par exemple, prenez la syntaxe du Binding, en Xaml donc. Vous avez une balise, vous la complétez d’une propriété et là, au lieu de mettre une valeur, vous ouvrez des accolades américaines suivies du mot Binding, le tout entre guillemets, une simple chaine de caractères. Quant à ce qu’il y a après le mot Binding, je suis convaincu qu’aucun aficionado de WPF ou de Silverlight n’est capable de me citer de tête toutes les combinaisons possibles et astuces disponibles. Parfois  c’est {Binding} tout court, parfois c’est une longue phrase intégrant imbriquées d’autres accolades faisant référence à des ressources statiques ou dynamiques, des paramètres, des convertisseurs, etc… Une puissance énorme, un peu comme les expressions régulières : puissant mais pas très clair (et c’est un euphémisme). Pas clair, on peut s’y faire… mais pas clair et pas fortement typé ni même contrôlé, c’est là que la chute aux enfers commence…

Le code que j’ai audité était bourré d’element binding, de datacontext pointant des conteneurs de services avec des indirections dans tous les sens “pour la souplesse”. Quand MVC et MVVM ne sont pas compris, mieux vaut tout mettre en procédural dans le code-behind de chaque fiche, c’est plus simple à débugger ! Le pire c’est que chacun dans l’équipe y allait de sa petite couche, de sa petite modification. Et je fais du “refactoring” par là, et je refactore par ici… Oui mais voilà, dans les balises Xaml ça commence à danser le cha-cha-cha toutes ses chaînes de caractères non contrôlées, tous ces paramètres de convertisseurs qui ont évolués sans qu’on ait mis à jour les références dans le Xaml, ces ressources statiques et d’autre dynamiques dans des dictionnaires chargés dynamiquement !

Le soft ne tenait plus que par un fil qu’un joyeux drille a du couper juste avant que je n’intervienne. Dommage. Je n’arrivais même pas à dépasser un ou deux écrans avant que ça me pète à la figure. Même avec des outils très intelligents comme NDepend, comprendre le soft était virtuellement impossible.

Quant à savoir d’où vient “le” problème ! C’est le soft lui-même tout entier qui était “le” problème… Ainsi que ceux l’avaient écrit (et ceux qui les dirigent, car un mauvais soft est toujours la cause d’une mauvaise direction bien plus que de mauvais développeurs).

En fait, le Binding Xaml est une porte ouverte sur l’inconnu. Une feature d’une grande puissance, sans laquelle beaucoup du charme disparaîtrait, mais assez déraisonnable dans cette implémentation libre sous forme de chaînes de caractères non compilées. La porte sur le néant, l’incontrôlé, et pire : l’incontrôlable. Un trou noir syntaxique. La damnation du testeur envoyé moisir au purgatoire des pisseurs de ligne. Et l’enfer de l’auditeur.

le Binding au pays des X-Files

Le Data binding Xaml est une jungle syntaxique pas très bien … balisée et totalement déconnectée de toute forme d’analyse à la compilation. du “Late Bugging” comme je m’amuse à appeler cette stratégie de type “late binding”, principe de ligature tardive utilisé d’ailleurs en d’autres endroits et même sous d’autres frameworks. Pire que les Dynamic de C# 4 (pratiques mais dangereux), pire que F# (stimulant mais pas industrialisable), le Binding de Xaml est un gouffre à bugs, un chien fou s’il n’est pas tenu en laisse fermement.

En réalité un marteau ne pourra jamais être jeté aux fers (!) pour le meurtre de qui que ce soit. Un marteau est un outil, et même s’il a servi et servira encore dans de nombreux crimes, un outil est un objet sans âme, sans conscience et donc sans responsabilité. Même un fusil mitrailleur est un objet innocent, même un canon de 105 ou une bombe atomique sont plus innocents que l’agneau qui vient de naître et qui, comme tout être vivant, et à la mesure de son intelligence, portera le poids de la responsabilité de ses agissements. Un outil de développement restera donc à jamais hermétique à tout procès d’intention. A celui qui s’en sert de le faire correctement.

Il en va de même de Xaml, de son data Binding et de bien d’autres de ces facettes. La responsabilité incombera toujours à l’humain qui tient le marteau. A l’informaticien qui tient la souris. Au développeur qui tape un code affreux.

Mais certaines features de Xaml, certains choix conceptuels comme l’utilisation de chaînes de caractères non contrôlées et non parsées à la compilation sont à mon sens des erreurs. Si des projets comme celui que j’ai audité et dont je vous parle ici devenaient courants, nul doute que cela signerait l’arrêt de mort de WPF et de Silverlight. La faute aux mauvais développeurs ? Pas seulement. A ceux aussi qui ont décidé de programmer Xaml de cette façon trop ouverte, trop permissive. On voit bien comment Silverlight a été verrouillé dès le départ par Microsoft. Si le moindre virus, le moindre phishing avait été réalisé avec Silverlight 1 ou 2 c’en était fini des espoirs portés par cette technologie. Microsoft a été méfiant pour préserver l’avenir de la technologie et c’est une bonne chose. Ce que j’ai vu dans le projet WPF dont je parle ici, c’est un peu de la même nature, mais à l’inverse : Microsoft n’a pas verrouillé Xaml comme cela a été fait avec Silverlight. Et si de tels détournements se généralisent c’est toute la technologie qui trinquera. D’ici un an environ, lorsque les projets lancés ces derniers temps seront finalisés, et qu’il faudra compter ceux qui n’aboutiront pas ou qui ne marcheront jamais bien, la note peut être salée pour Xaml. Microsoft a pris un sacré risque en faisant des choix de conception comme celui des balises non compilées (et dans lesquelles même Intellisence se prend les pieds dans le tapis).

Déjà sous Delphi je voyais souvent ce genre de code spaghetti avec des variables globales référencées n’importe où, des fiches utilisant des variables d’autres fiches jusqu’à créer des chaines de dépendances ingérables. J’ai vu des codes de ce type ne pouvoir jamais aboutir. Il m’est même arrivé une fois de réécrire en 15 jours proprement à partir de zéro un soft développés en 1 an par deux personnes sans le dire au client histoire que les 15 jours d’expertise qu’il m’avait payés servent à quelque chose… Je tairais ici le nom du client (une administration). J’étais plus jeune et je voulais me prouver des choses certainement, mais personne ne l’a jamais su jusqu’à ce billet (et encore vous en savez peu!). En tout cas ce projet là je l’ai sauvé. Mais être un pompier de l’ombre n’est pas ma vocation. Les gars étaient malgré tout étonnés ne pas vraiment s’y retrouver dans “leur” code. Amusante situation. Je n’avais rien gardé de “leur” code :-) Mais le soft marchait…

Mais avec Xaml, et une puissance décuplée, je viens de voir des horreurs du même genre alors que depuis des années, je commençais à trouver que C# incitait plutôt à faire du code “correct”, le niveau étant globalement meilleur que celui que je voyais sur Delphi. Et patatras ! Xaml arrive avec ces chausses-trappes dans lesquels les développeurs s’engouffrent. La faute à Xaml ? Pas totalement, mais si tout était typé et contrôlé à la compilation certaines mauvaises utilisations ne seraient pas possibles. Après tout, le fortement typé en soi ça ne sert à rien si on suppose que tous les développeurs sont “bons” ! Mais tous les langages modernes tentent de l’être car on sait que l’humain est faillible. En créant une brèche incontrôlable dans un édifice aussi beau de Xaml, ses concepteurs ont fait un pari risqué. Celui que tous les développeurs sauraient maîtriser le potentiel sans tomber dans ses pièges. Un pari forcément perdu d’avance.

Vision d’horreur

Ce que j’ai vu est donc indescriptible. Un peu comme si j’essayais de décrire Cthulhu. Ceux qui ont essayés sont souvent morts avant de finir d’écrire son nom (ah Lovecraft…) !

Imaginez vous un logiciel de 250 fiches WPF environ utilisant de l’ADO.NET, des bouts de LINQ to SQL, et des nouveautés en Entity Framework, le tout à la sauce Prism / MVC (mais en ayant lu le manuel certainement à l’envers car Prism c’est très bien !) avec des tentatives d’inversion de contrôle (et des dérapages non contrôlés) farci d’un code Xaml bourré de Binding renvoyant vers on ne sait quoi (et hélas pas contrôlé à la compilation), le tout planqué dans 4 ou 5 couches DAL, BOL pré-BOL, post-BOL, et j’en passe, histoire de faire court. La note s’élève a 6000 jours/homme (5 ans/homme environ). Pas un truc gigantesque mais qui commence à faire mal au budget malgré tout.

Agrémentez le tout de deux systèmes de versionning dont aucun n’avait vraiment une version complète du soft, des essais épars de tests unitaires avec MbUnit et VSTS. Vous obtiendrez le tableau. Une œuvre qui dépasse le classicisme habituel de ce point de vue, plus proche du Cubisme que de l’Hyperréalisme tout de même, avec au moins la bonne volonté de faire des petites choses (du mauvais testing prouve au moins qu’on a essayé de tester, ce qui est encore bien rare…). Mais l’enfer est pavé de bonnes intentions, c’est un peu ça le problème.

Le code était impossible à maintenir, les problèmes de performances impossible à cerner sans y passer plus de temps qu’à toute refaire, le code Spaghetti, avec un grand S avait frappé de son coup de poignard vengeur et lâche dans le dos. Une complexité non maîtrisée qui tel l’horizon d’un trou noir aspirait irrémédiablement le bon code vers l’enfer central laissant le hasard faire le tri entre les chemins à prendre… Démêler l’écheveau n’était pas possible, pas plus que de formuler des guidelines sérieusement applicables dans un tel contexte ni aucun conseil pour se sortir d’une telle situation.

Vous imaginez peut-être l’horreur qu’a été l’écriture du rapport d’audit. Entre dire une vérité que personne n’était prêt à entendre et mentir sachant que peu importe ce que je dirais cela passerait mal et qu’au fond mieux valait ne pas trop déplaire… Mon éthique a tranché, j’ai dit la vérité. En l’enrobant. Des heures passées à réécrire deux fois, dix fois certains paragraphes. Ils ne s’en douteront jamais… Et au final un rapport qui sera peut-être classé au fond d’un tiroir car personne ne voulait vraiment savoir ce qui n’allait pas. La remise en question d’un tel échec dépasse de loin le cadre technique et peu de gens savent admettre leurs erreurs, surtout quand toute la chaîne hiérarchique de la base au sommet doit participer à ce questionnement.

Le salaire de la peur

La peur dont je parlais plus haut, les chocottes que cet audit m’a données, c’est d’être confronté au fleuron de la technologie informatique, à des choses en lesquelles je crois car elles marquent un réel progrès et que (bien utilisées) elles permettent justement un code limpide. Cet audit a brisé ce fantasme en me rappelant qu’un marteau pouvait servir au meilleur, comme au crime. Xaml, WPF et Silverlight n’échapperaient pas à la règle et il faudra être vigilant. Surtout que l’avalanche de technologies et de patterns (WCF Ria Services, Entity Framework, MVVM, Prism, …) rendent presque impossible la maîtrise de tous ces sujets. Je suis payé pour ça. Au minimum 50% de mon temps est passé en autoformation pour apporter un conseil éclairé sur les technos à venir. Ce sont les 50% vendus qui financent cette formation et cette recherche permanente. Comment un développeur qui fait ces 48h (35 de base + le dépassement obligatoire non payé car il est aux “cadres”) peut-il se former à tout cela en travaillant sur d’autres projets la journée ? C’est impossible. Et cela créé une situation très dangereuse. Technologie sophistiquée + manque de formation = code spaghetti !

David Vincent au pays des tags

Il était donc urgent de vous en parler, d’attirer votre attention sur certaines dérives, car dans une moindre mesure, je sais, je l’ai vu chez d’autres, ces chausses-trappes savent s’ouvrir sous les pieds des développeurs les mieux formés et les mieux intentionnés !  Je les ai vues, et je dois convaincre un monde incrédule…

Ma mission, que j’ai acceptée (forcément avant de voir, on a pas vu…), était de faire un audit de pré-release. C’est à dire de venir faire le point sur l’état de la situation, les derniers fameux “boulons à serrer” en quelque sorte, et surtout de venir signer un satisfecit au DI, très fier de son bébé (Rosemary’s baby plutôt que Dora de TF1 au final), afin qu’il puisse faire monter sa prime de fin d’année je suppose.

Hélas, déception et vilenie. Ce n’est pas avec le prix d’un audit (fort raisonnable, devis gratuit sur simple demande) qu’on achète ma conscience. Il m’a donc fallu trouver les mots et les formules diplomatiques pour rendre un audit policé et mesuré sur cet édifice in-maintenable, voué à l’échec et bon à mettre à la broyeuse. Ce n’est pas la partie la plus difficile, car tout rapport d’audit se doit d’être policé et tourné de façon neutre et technique. Même si parfois on a envie de crier “bande de nuls !”, non, ce n’est pas bien, on ne le fait pas…

Que les futurs clients ne s’affolent pas trop, ce que je raconte aujourd’hui est malgré tout à classer dans les exceptions, le fameux bout de la cloche de la courbe Normale. Même si je ne suis que rarement content du code que je vois, on est, heureusement en moyenne, assez loin de l’horreur qui justifie le présent billet !

O Tempora, O Mores !

Parfois je rêve, j’imagine un monde où l’un de ces clients m’appellerait en me proposant un pont d’or pour lui avoir ouvert les yeux et l’avoir empêché de plonger plus encore tant qu’il était encore temps… Mais ce n’est qu’un rêve, bien entendu. Je suppose que je n’entendrais plus parler de ce client comme de quelques autres dont, les années passant et les vœux annuels restant sans réponse m’ont forcé à une résignation réaliste. Comme le chantait l’artiste, “il a dit la vérité, il doit être exécuté” !

Hélas, les temps ne sont pas à la prise de conscience ni à la bravoure. Nous vivons une époque de lâches où chacun ouvre son parapluie pour que les gouttes en atteignent d’autres. Forcément celui qui est au plus bas de la pyramide se prend tout sur la figure. Souvent c’est le développeur qui trinque pour une chaîne hiérarchique défaillante qui n’a pas fait son métier et qui n’assume pas ses responsabilités. Un développeur n’est jamais coupable seul d’un mauvais code, c’est toute la chaine de commandement qui faillit.

Il y a encore un rêve que je fais et que j’aimerais voir se réaliser avant ma (encore lointaine) retraite : que les entreprises fassent intervenir un conseil, un auditeur avant que l’irréparable ne soit commis, pas après pour constater les dégâts ! … ça serait tellement mieux et plus gratifiant pour moi et mes confrères ! Conseiller, orienter, former, en un mot aider, c’est tout de même plus chouette que de passer pour le père fouettard et l’inspecteur des travaux finis !

Faut-il brûler Xaml ?

Certes non.

Mais ce que je veux qu’il vous reste de ce récit hallucinant autant que réel, c’est que Xaml est utilisé par certains comme un langage dans le langage. Un moyen de vider le code-behind de son C# pour remplir des balises ésotériques. Un langage dans le langage avec son Binding qui est, telles le sont les poupée Russes, encore un langage dans le langage.

A vouloir tout faire par binding, à tout dynamiser, à appliquer tout Prism et le chargement dynamique des modules, la découvertes des plugins avec MEF, le tout mis en forme façon MVVM, sans compter les ruses purement graphiques du templating sous Blend, des DataTemplate à double face pivotante en 2,5 D, à vouloir appliquer tout cela dans un seul soft sans avoir pris les 2 ou 3 ans nécessaires à acquérir la parfaite maîtrise méthodologique pour faire marcher tout cela ensemble, on peut facilement arriver à une situation désastreuse. Encore plus facilement que sous C, encore plus que sous Delphi, pire que sous Windows Forms. Tout cela n’était que de l’amateurisme face aux dérapages délirants que WPF et Silverlight peuvent permettre… Comment faire des tests unitaires parlants sur des balises de Binding imbriquées à un tel point que même Intellisense de VS s’y perd ?

L’extrémisme essayiste est un fléau dans notre métier. Il m’a toujours effrayé, mais il a toujours eu sa sanction “naturelle” : une technologie qui finit par être si mal utilisée créée une telle publicité négative qu’elle tend à disparaître. Je ne voudrais pas que cela arrive à WPF et à Silverlight qui apportent tant d’autres progrès !

Il faut sauver le soldat Xaml !

Pitié pour Xaml, un bon geste pour WPF et Silverlight : ne laissez pas des sagouins faire du mal à toutes ces belles technologies que Microsoft nous offre depuis quelques années. Laissez leur une chance, celle que les développeurs deviennent plus matures et mieux formés aux méthodologies qui vont avec. Ne commettez pas le crime d’être complice de ce genre de chose. Intégrer les technologies les unes après les autres, ne sautez pas d’une bêta à l’autre sans avoir l’assurance que vous maîtrisez la précédente !

Mieux vaut une application Silverlight fonctionnant avec un Service Web classique et dont les champs sont connectés par code, qui marche et qui est maintenable, qu’une élucubration technologique improbable et non maîtrisée qui s’écroulera comme un château de carte au premier éternuement du premier bug venu…

Un peu de sérieux…

Il ne s’agit pas d’une invitation à la méfiance, encore moins au passéisme. Non, c’est une invitation au professionnalisme : n’utilisez que ce que vous maîtrisez.

Si vous maîtriser le top de la techno, allez-ci, franchement. Si vous avez un petit doute : faites joujou dans une machine virtuelle et produisez du code que vous comprendrez à 100% et surtout que d’autres pourront comprendre pour le maintenir, le faire vivre dans les années à venir.

Le code Kleenex coûte cher, il dévalorise notre métier et les outils que nous utilisons.

Le code spaghetti peut assassiner une technologie.

Codez bien. Formez-vous bien.

Et faites auditer vos projets avant, pas après.

Et Stay Tuned, j’aurais des trucs plus légers à vous dire la prochaine fois !

All in one ! +290 exemples de code .NET

Voici un projet CodePlex un peu atypique puisqu’il ne s’agit pas d’une librairie ni d’un contrôle et encore moins d’une application puisque ce ne sont pas moins de 290+ applications exemples couvrant les principales fonctionnalités de .NET le tout en C# et VB.NET (et même C++) !

All-in-One est un projet Microsoft qui balaye ainsi le Framework presque de bout en bout, de COM à Silverlight en passant par les accès aux données, la sécurité, Office, Azure, etc.

La liste complète de tous les exemples offre une vue détaillée sur tous les projets de ce kit un peu particulier.

L’ensemble du kit peut être télécharger sur la page CFX de CodePlex.

Un ensemble de code à posséder, justement pour l’exemple, les idées et le nombre impressionnant de domaines couverts.

Silverlight : Enum.GetValues qui n'existe pas, binding et autres considérations

Silverlight, comme vous le savez, propose dans quelques méga octets un mini framework .NET qui est tellement bien "découpé" que la plupart du temps on ne se rend même pas compte qu'il manque des dizaines de méga de code binaire... Pourtant entre une installation complète du Framework 3.5 ou 4.0 à venir et l'installation du plugin Silverlight il y a comme une énorme différence ! De deux choses l'une, soit Silverlight ne sait rien faire tellement il est diminué par ce découpage, ce qui n'est pas le cas, soit le Framework complet est juste gonflé avec des fichiers inutiles pour "faire sérieux", ce qui n'est pas le cas non plus :-)

Un découpage savant 

Donc ce n'est ni l'un ni l'autre. La troisième possibilité, qui est la bonne réponse, est que le Framework complet est d'une richesse infinie dans les moindres détails, et que le Framework Silverlight "ruse" en zappant beaucoup de détails mais sans perdre l'essentiel. Cela donne l'impression qu'on peut tout faire en Silverlight comme en WPF. C'est "presque" vrai. Assez rapidement on tombe sur les fameux petits détails qui manquent. Cela implique de les compenser par du code.

Cela dit loin d'être une critique négative de Silverlight s'en est au contraire une apologie ! Je trouve en effet le découpage savant qui a été effectué dans Silverlight particulièrement bien fait. L'approche est très sensée : il est rarissime (même impossible) qu'une application utilise et nécessite d'accéder à toutes les méthodes, toutes les propriétés de toutes les classes du Framework tellement celui-ci est riche. Du coup, en faisant des coupes bien choisies, on peut laisser les squelettes de presque tout le Framework ainsi que les principales méthodes et propriétés utilisées le plus souvent. On obtient le Framework Silverlight dans lequel un code standard trouvera 95% de tout ce qu'il lui faut pour tourner. Beaucoup d'applications simples ne verront même pas qu'il manque quelque chose. En revanche pour les autres cas, le développeur ajoutera les contournements nécessaires ce qui grossira un peu son code binaire Silverlight, mais d'une petite fraction très supportable. Rien à voir avec le coût d'une installation du Framework complet.

Il n'en reste pas moins vrai que parfois pour des choses très simples on se retrouve un peu le bec dans l'eau. "Tiens, c'est bizarre, j'aurais juré que la méthode xxx existait !" Et non, on n'a pas rêvé, elle existe bien, mais dans le Framework complet, pas dans celui de Silverlight. Un exemple tout simple : la méthode GetValues() de la classe Enum.

Enum.GetValues où es tu ?

Un cas d'utilisation très basique qui fait voir immédiatement qu'il manque quelque chose : essayez de faire un binding entre une combobox et une énumération. Truc classique par excellence.

Que le binding soit fait par Xaml ou bien par code, à un moment où un autre il faut que l'énumération sache retourner la liste de ses valeurs. C'est justement la fonction de la méthode Enum.GetValues().

Mais dans le Framework Silverlight cette méthode n'existe tout simplement pas. Victime de la cure d'amaigrissement évoquée plus haut. Il ne s'agit donc ni d'un oubli ni d'un dommage collatéral, c'est un parti pris, assumé.

Et alors on fait comment ?

Assumé, assumé... comme il y va ! Non, je vous l'assure, c'est assumé. Par l'équipe qui développe le Framework Silverlight en tout cas. Mais pas forcément par les développeurs qui l'utilisent ! Car pour eux c'est une autre histoire puisque, en effet, il va falloir réinventer cette méthode.

A l'aide d'un peu de Linq to Object et de Reflexion, on peut s'en sortir.

Linq et Reflexion

Il existe en effet un moyen d'obtenir les valeurs d'une Enum par la réflexion, en utilisant la méthode GetFields() sur le type de l'Enum dont on souhaite obtenir les valeurs. 

GetFields() retourne un tableau de FieldInfo. Une Enum présente alors ses différentes valeurs comme un tableau de champs. En plus de ces champs, GetFields() retournera aussi des éléments qui ne sont pas des valeurs de l'énumération mais d'autres champs de la classe. Au sein de FieldInfo vous trouverez un ensemble de méthodes nommées Isxxx(), l'une d'entre elles nous intéresse plus particulièrement ici; c'est IsLiteral. Toutes les valeurs de l'énumération retournent True. La solution est alors simple en ajoutant à la Réflexion un peu de Linq to Object :

   1:  var enumType = typeof(monEnumeration);
   2:  var fields =  from field in enumType.GetFields()
   3:                where field.IsLiteral
   4:                select field.GetValue(null).ToString();
   5:  LaCombobox.ItemsSource = fields;

A partir du type de l'énumération (ligne 1) on construit une requête Linq to Object qui filtre tous les champs ayant IsLiteral à vrai et qui sélectionne la valeur de ce champ sous la forme d'une string.

Ne reste plus qu'à faire le binding entre cette requête Linq et ItemsSource de la combo box.

Il faudra ajouter un peu de code pour transformer la chaîne sélectionnée dans la combo en une valeur de l'énumération grâce à un appel à Enum.Parse().

C'est la version simple et courte. Bien entendu dans le cas où on souhaite faire du binding plus automatisé, notamment directement en Xaml, la solution donnée ici est un peu trop simple. L'esprit est le bon mais il manque des petites choses comme un convertisseur de valeurs.

D'autres versions plus sophistiquées

Il est bien sûr possible d'aller plus loin et de formuler une solution plus sophistiquée qui permettent de faire du binding en Xaml notamment. Je vous laisse y réfléchir, ça fait un bon excercice C# et ce n'est pas un MVP C# qui vous dira que s'entraîner mentalement de la sorte sur le langage est inutile ! :-)

Mais sachez que d'autres y ont déjà pensé et ont proposé des solutions souvent assez proches (ce problème ne peut pas être résolu de dix milles façons). En voici quelques unes dans lesquelles vous pourrez piocher matière à aller plus loin :

Silverlight c'est sympa et en plus ça fait travailler les méninges, que du bon ! 

Stay Tuned !

 

 

 

Obama for President !

Il est  5h50 du matin... 338 grands électeurs contre 155, la victoire de Obama est large et sans discussion. McCain a, selon la tradition, appelé le gagnant et fait en premier son discours annonçant et reconnaissant la victoire de Obama. Il est 6h01 maintenant (je relis ce billet) et Obama s'exprime à la tribune.

Sans bavure, sans discussion. Obama devient le premier président noir des USA.

L'instant est historique et démontre la capacité du peuple américain à se dépasser, à bouleverser les clivages les plus infranchissables. Autant l'élection de GW Bush fut une erreur déprimante, autant celle de Obama montre au monde la voie d'une démocratie vivante.

A quand un président se prénomant Mohamed ou Fet-Nat en France ? Serons-nous capable, au-delà de notre fâcheuse habitude de donneurs de leçons, de prouver que nous sommes nous aussi un grand peuple ? ...

Plus loin que le symbole humaniste et l'espoir qu'il soulève, notons sur le plan strictement politique qu'au moment où nous avons à peine élu un président à la solde de Bush et voulant, entre autres choses, privatiser notre système social, les USA, le pays le plus libéral et le plus capitaliste du monde, viennent d'élire un noir de gauche qui veut instaurer un système de sécurité sociale universel...

Il y a de quoi se sentir petit. Tout petit. Il paraît qu'on a le président qu'on mérite. ça fiche un coup.

Mais les américains viennent de montrer que tout est possible, Yes We Can ! doit devenir notre slogan à nous aussi. Balayons les guignols qui nous gouvernent, autant que la fausse gauche caviar qui veut prendre sa place, osons avancer vers plus d'humanisme, vers plus de Fraternité et d'Egalité, et en ces temps où le sénat vient de voter la riposte graduée consistant à appliquer une peine collective à toute une famille sans qu'aucun juge n'intervienne, donc surtout osons protéger la Liberté.

La réalisation du vrai rêve américain c'est l'élection de Obama. Sachons copier ce qu'elle a de meilleure au lieu de vouloir appliquer ce qu'elle a de pire.

La démocratie est ce matin victorieuse. L'amérique est victorieuse. Elle peut être fière d'elle-même. Que cela puisse nous inspirer...

 

Le Mythe du StringBuilder

Sur l'excellent blog du non moins excellent Mitsu, dans l'une de mes interventions sur l'un de ses (excellents aussi) petits quizz LINQ, j'aurai parlé du "Mythe du StringBuilder". Cela semble avoir choqué certains lecteurs qui m'en ont fait part directement. Le sujet est très intéressant et loin de toute polémique j'en profiterais donc ici pour préciser le fond de cet avis sur le StringBuilder et aussi corriger ce qui semble être une erreur de lecture (trop rapide?) de la part de ces lecteurs. J'ai même reçu un petit topo sur les avantages de StringBuilder (un bench intéressant par ailleurs).

D'abord, plantons le décor

Le billet de Mitsu dans lequel je suis intervenu se trouve ici. Dans cet échange nous parlions en fait de la gestion des Exceptions que l'un des intervenants disait ne pas apprécier en raison de leur impact négatif en terme de performance. Et c'est là que j'ai répondu :

"...Dans la réalité je n'ai jamais vu une application (java, delphi ou C#) "ramer" à cause d'une gestion d'exception, c'est un mythe à mon sens du même ordre que celui qui veut que sous .NET il faut systématiquement utiliser un StringBuilder pour faire une concaténation de chaînes."

Comme on le voit ici, seule une lecture un peu trop rapide a pu faire croire à certains lecteurs que je taxe les bénéfices du StringBuilder de "mythe". Je pensais que la phrase était assez claire et qu'il était évident que si mythe il y a, c'est dans le bénéfice systématique du StringBuilder... Nuance. Grosse nuance.

Mythe ou pas ?

La gestion des exceptions est un outil fantastique "légèrement" plus sophistiqué que le "ON ERROR GOTO" de mon premier Basic Microsoft interprété sous CP/M il y a bien longtemps, mais le principe est le même. Et si en 25 ans d'évolution, la sélection darwinienne a conservé le principe malgré le bond technologique c'est que c'est utile...

Est-ce coûteux ?

Je répondrais que la question n'a pas de sens... Car quel est le référenciel ?

Les développeurs ont toujours tendance à se focaliser sur le code, voire à s'enfermer dans les comparaisons en millisecondes et en octets oubliant que leur code s'exprime dans un ensemble plus vaste qui est une application complète et que celle-ci, pour être professionnelle a des impératifs très éloignés de ce genre de débat très techniques. Notamment, une application professionnelle se doit avant tout de répondre à 3 critères : Répondre au cachier des charges, avoir un code lisible, être maintenable. De fait, si les performances ne doivent pas être négligées pour autant, le "coût" d'une syntaxe, de l'emploi d'un code ou d'un autre, doit être "pesé" à l'aulne d'un ensemble de critères où celui de la pure performance ne joue qu'un rôle accessoire dans la grande majorité des applications. Non pas que les performances ne comptent pas, mais plutôt que face à certaines "optimisations" plus ou moins obscures, on préfèrera toujours un code moins optimisé s'il est plus maintenable et plus lisible.

Dès lors, le "coût" de l'utilisation des exceptions doit être évalué au regard de l'ensemble de ces critères où les millisecondes ne sont pas l'argument essentiel.

De la bonne mesure

Tout est affaire de bonne mesure dans la vie et cela reste vrai en informatique.

Si une portion de code effectue une boucle de plusieurs milliers de passages, et si ce traitement doit absolument être optimisé à la milliseconde près, alors, en effet, il sera préférable d'éviter une gestion d'exception au profit d'un ou deux tests supplémentaires (tester une valeur à zéro avant de s'en servir pour diviser au lieu de mettre la division dans un bloc Try/Catch par exemple).

Mais comme on le voit ici, il y plusieurs "si" à tout cela. Et comment juger dans l'absolu si on se trouve dans le "bon cas" ou le "mauvais cas" ? Loin de la zone frontière, aux extrèmes, il est toujours facile de décider : une boucle de dix millions de passages avec une division ira plus vite avec un test sur le diviseur qu'avec un Try/Catch (si l'exception est souvent lancée, encore un gros "si" !). De même, un Try/Catch pontuel sur un chargement de document sur lequel l'utilisateur va ensuite travailler de longues minutes n'aura absolument aucun impact sur les performances globales du logiciel.

Mais lorsqu'on approche de la "frontière", c'est là que commence la polémique, chacun pouvant argumenter en se plaçant du point de vue performance ou du point de vue qualité globale du logiciel. Et souvent chacun aura raison sans arriver à le faire admettre à l'autre, bien entendu (un informaticien ne change pas d'avis comme ça :-) ) !

Où est alors la "bonne mesure" ? ... La meilleure mesure dans l'existence c'est vous et votre intelligence. Votre libre arbitre. Il n'y a donc aucun "dogme" qui puisse tenir ni aucune "pensée unique" à laquelle vous devez vous plier. A vous de juger, selon chaque cas particulier si une gestion d'exception est "coûteuse" ou non. N'écoutez pas ceux qui voudraient que vous en mettiez partout, mais n'écoutez pas non plus ceux qui les diabolisent !

Et le StringBuilder dans tout ça ?

Si dans mon intervention sur le blog de Mitsu j'associais gestion des exceptions et StringBuilder c'est parce qu'on peut en dire exactement les mêmes choses !

Dans les cas extrêmes de grosses boucles il est fort simple de voir que le StringBuilder est bien plus performant qu'une concaténation de chaînes avec "+". Cela ne se discute même pas.

Mais, comme pour la gestion des exceptions, c'est lorsqu'on arrive aux "frontières" que la polémique pointe son nez. Pour concaténer quelques chaînes le "+" est toujours une solution acceptable car le StringBuilder a un coût, celui de son instanciation et du code qu'il faut écrire pour le gérer. Il s'agit là des cas les plus fréquents. On concatène bien plus souvent quelques chaines de caractères dans un soft qu'on écrit des boucles pour en concaténer 1 million le tout dans un traitement time critical... (encore des tas de "si" !).

Même du point de vue de la mémoire les choses ne sont pas si simple. Le StringBuilder utilise un buffer qu'il double quand sa capacité est dépassée. Dans certains cas courants (petites boucles dans lesquelles il y a quelques concaténation), le stress mémoire infligé par le StringBuilder peut être très supérieur à celui de l'utilisation de "+" ou de String.Concat.

C'est dans ces cas les plus fréquents que l'utilisation du StringBuilder comme panacée apparaît n'être qu'un mythe.

Conclusion 

Vous et moi écrivons du code, ce code se destine à un client / utilisateur. La première exigence de ce dernier est que le logiciel réponde au cahier des charges et qu'il fonctionne sans bug gênant. Cela impose de votre côté que vous utilisiez une "stylistique" rendant le code lisible et facilement maintenable car un code sans bug n'existe pas et qu'il faudra tôt ou tard intervenir ici ou là. Dans un tel contexte réaliste, ce ne sont pas les millisecondes qui comptent ni les octets, mais bien la qualité globale de l'application. Et c'est alors que les dogmes techniques tombent. Car ils n'ont d'existence que dans un idéal purement technique qui fait abstraction de la réalité. Un Try/Catch ou un StringBuilder ne peuvent pas être étudiés en tant que tels en oubliant les conditions plus vastes de l'application où ils apparaissent. Leur impact n'a de sens que compris comme l'une des milliers d'autres lignes de code d'une application qui doit répondre à un autre critère, celui de la qualité et de la maintenabilité.

Un seul juge existe pour trancher car chaque cas est particulier : vous.

Pour ceux qui veulent jouer un peu avec les StringBuilder, voici un mini projet que vous n'aurez qu'à modifier pour changer les conditions de tests : ConsoleApplication2.zip (6,10 kb)

Télécharger de la musique sans se faire pincer ? La solution existe !

Pour aborder un sujet qui change de l'informatique, la musique.

C'est un sujet qui me tient tout autant à coeur et même plus que l'informatique. Musicien, compositeur, quand je ne développe pas, je joue (ou je vais à la pèche mais c'est plus rare malgré tout :-) ). Seule la contemplation de la voûte étoilée ou un bon film de SF peut arriver à me distraire de mes claviers, Azerty ou Midi. Bref même si j'en parle moins ici, ce n'est pas la moindre de mes occupations. Et les nouvelles lois anti piratage me concerne forcément, triplement même. En tant que musicien, en tant que membre de la SACEM, et en tant que simple citoyen.

Le pirate tueur de l'Art ?

Les lois contre le piratage de musique sont dénuées de sens, et je ne m'étalerai pas trop de peur de déraper vers un langage plus.. vert ! Toutefois leur seul et véritable argument est que cela tue la "création", et à grand renfort de vedettes(*) trustant déjà l'essentiel des dividendes de la SACEM on nous explique, en gros, que si Johnny ou Cabrel ne peuvent pas sortir leur 253eme album c'est l'art qui meurt... A pleurer.

(*) voici la liste des vendus à la cause des majors, ce n'est pas secret (on comprend bien de quoi je parle, des johnny en fin de carrière qui veulent toucher encore plus de sous, des jeunôts qui voudraient palper autant que leurs aînés, et plein de nains de l'art (avec petit a) qui pensent que ça fera du buzz autour de leur nom de faire partie des 52... J'exagère, dans le tas il y a aussi des sarkozystes, pas mal même). Tiens, le plus amusant, c'est peut-être qu'ils sont jaloux des artistes qui se font vraiment pirater (signe de reconnaissance), car eux, je n'ai aucun mp3 à leur nom, et pareil chez mes amis... Des gros jaloux ces 52 ? Fort possible. Car un artiste piraté est aussi un artiste qui vend, c'est donc pas le mieux placé pour se plaindre en général.

Les 52 vendus, le premier ça me fait de la peine j'avais de l'estime pour lui (sans l'écouter, juste de la sympathie, c'est fini) : Etienne Daho, Christophe Maé, Kery James, Sinik, Francis Cabrel, Patrick Bruel, Jean-Jacques Goldman, Jenifer, Stanislas, Raphaël, M Pokora, Keren Ann, Thomas Dutronc, Eddy Mitchell, Isabelle Boulay, Maxime Le Forestier, Martin Solveig, Marc Lavoine, Calogero, Gérard Darmon, Pascal Obispo, Jacob Devarrieux, Elie Seimoun, Alain Bashung, Bernard Lavilliers, Rachid Taha, Bob Sinclar, Psy4delarime, Abd Al Malik, Anis, André Manoukian, Charles Aznavour, Alain Souchon, Mademoiselle K, Soprano, Arthur H, BB Brunes, Liane Foly, Emmanuelle Seigner, Ridan, Renan Luce, Zita Swoon, Johnny Hallyday, Empyr, Kenza Farah, Shine, Camaro, Diam's, Renaud, Romane Cerda, Cali et la Grande Sophie. Lire la  dépêche AFP sur le site de Yahoo.

La réalité c'est que ce sont les majors qui tuent l'art et la création en bastonnant quelques "vedettes" sur lesquelles elles misent et investissent comme un riche émir investit dans quelques chevaux de course. Cela est-il profitable à l'espèce équine dans son ensemble pour autant ? Certes non. Les riches émirs pourraient arrêter de s'échanger des chevaux à plusieurs millions de dollars, la race équine n'en mourrait pas, elle existe en dehors des "bêtes à concours". La musique c'est pareil. Sans les majors qui se focalisent sur des bêtes à concours, il existe des milliers, des millions peut être même, d'artistes qui ont aussi le droit de s'exprimer et qui dans tous les cas ne touchent absolument rien de la SACEM ! Si demain le piratage était réduit à zéro, Johnny aurait certainement un chèque encore plus gros en fin d'année, mais AUCUN de tous les artistes non affiliés à la SACEM ne toucherait quoi que ce soit (et d'ailleurs les "petits" membres de la SACEM ne touchent rien non plus de toute façon, il faut le savoir, question de pourcentage de passage ... dans les radio vendues aux majors notamment...). Rappelons aussi que les majors affament les artistes : en moyenne c'est 60 eurocents par CD, 30 eurocents un DVD live et 4 eurocent le titre ! Avec de tels "salaires" on voit comment les majors aident l'art et les artistes...

De toute façon Résumer l'Art et surtout la musique à la "danse des canards" ou l'équivalent chez Jhonny, Cabrel et d'autres hasbeen est donc une hérésie, voire un crime contre l'humanité tellement l'art est indissociable de la nature humaine. Tuer le premier c'est tuer la seconde. Et les majors sont des assassins de l'Art.

De l'obligation morale de mettre hors jeu les majors

Face aux nouvelles dérives agressivement sécuritaires et répressives de notre président (petit p) de la République (grand R, la République est une noble idée) contre les méchants pirates il est temps de faire quelque chose. Les majors ont, soi disant, perdu 50% de leur chiffre d'affaire ? Prouvez-leur que leur stratégie répressive va les amener à perdre le reste ! Le système des majors est d'un autre âge, il a vécu, ils se sont goinfrés sur notre dos à chaque occasion, aujourd'hui ils ne servent plus à rien. On n'a pas hésité à mettre sur le carreau les mineurs du Nord, les gars des manufactures de Saint Etienne, les artisans fabriquants de chaussures ou de tissus et tout un tas de gens dont on a balayé l'existence d'un geste "parce que c'est le progrès", le temps est venu de balayer les majors sans plus de ménagement et pour les mêmes raisons !

Acte 1 : Achetez de la musique aux labels indépendants !

En effet il existe des tas de labels indépendants qui eux se mouillent pour proposer des oeuvres vraiment différentes, il y a de tout et je ne ferai pas l'apologie d'un style ou d'un autre, pour moi l'art est forcément multiple. Si vous trippez sur la techno ou le free-jazz ou le rap français ça ne fait aucune différence.  Il y a aussi Internet qui permet aujourd'hui à des artistes et aux petits labels de se faire connaître, voire de vendre en direct leur musique. C'est le sens de l'histoire. Sans les majors.

Les mesures de plus en plus répressives prisent contre les "pirates" sont féodales. Le Roi a toujours protégé les plus riches, ses alliés. Notre président est à la solde de son ami Bush, du libéralisme débridé, à la solde des gens capables de lui offrir des week-end sur des bateaux de luxe pour protéger leur business dans des rapprochements de république bananière, et à la solde des majors et de tous les rois de la finance et de la spéculation grâce à qui il vit bon train pendant que le peuple tire de plus en plus la langue. Il est l'heure de mettre un coup de pied dans la fourmilière. Globalement, politiquement. Mais revenons à la musique pour l'instant...

Je n'appellerai pas à la révolution, même si je la sens et la sais nécessaire, la dernière, celle de  1789 n'a fait qu'instrumentaliser le peuple pour virer les nobles au profit des bourgeois, ce qui n'a pas fait beaucoup progresser le mot "égalité" de notre devise nationale, c'est un simple constat pas une opinion politique... Et puis verser le sang et couper des têtes est à mon goût trop barbare. La révolution doit être silencieuse et efficace, il faut taper, fort, mais pas sur la tête, au portefeuille, la chose la plus sacrée pour ces adorateurs de dividendes.

Au lieu d'acheter de la musique à des majors, achetez à des petits labels indépendants. Découvrez qu'en dehors de Lorie il existe tout un vaste monde, celui de l'Art justement. Au lieu d'écouter les radios "d'Etat" qui bastonnent les "oeuvres" des majors, écouter la radio sur Internet il y a pour tous les goûts. Et pour nourrir votre lecteur MP3, ne téléchargez pas sur la Mule pour vous faire coincer et faire le jeu des tyrans, mais enregistrez la musique des radios Internet ! Inrepérable, légal, vous n'en aurez pas moins au bout d'un certain temps une collection de mp3 à faire pâlir de jalousie les pirates les plus fous !

Acte 2 : Téléchargez gratuitement et sans risque, enregistrez tout simplement !

Pour enregistre de la musique Internet facilement, sans que cela ne soit brouillé par les sons de windows ou autre, surtout n'utilisez pas des programmes qui enregistrent le "mixage stéréo" de votre carte son, le résultat est affreux. Utilisez plutôt un logiciel comme l'excellent (et gratuit) Screamer. Il vous permet de sélectionner la radio et de l'enregistrer (un fichier mp3 par morceau avec son nom, c'est pas merveilleux ça ? !). Bien entendu choisissez des radios de bonne qualité qui émettent en 128k.

Le temps de la "réponse graduée" contre les majors, ces assassins de l'art, ces spéculateurs qui trustent le pouvoir est arrivé. Mais sans jamais lever la main, non simplement en refusant de la mettre au portefeuille. Ils aiment l'argent plus que tout, les en priver c'est leur faire plus de mal que d'assassiner leur famille.

Acte 3 : Choisir de bonnes radio Internet sans pub 

Eclatez vous, "consommez" encore plus de musique qu'avant, mais en bypassant les vampires et en donnant votre argent aux labels indépendants ou bien en subventionnant une radio Internet comme SOMA FM, radio sans pub, soutenue par ses auditeurs et proposant une dizaines de programmation différentes pour tous les goûts. En cherchant un peu sur le Web on trouve pour tous les goûts de la musique de qualité.

ça fait du bien de gueuler un bon coup de temps en temps...

La prochaine fois je vous reparle de C#, c'est promis :-)

Et Stay Tuned !

 Signé un citoyen membre de la SACEM ... (comme quoi ils ne sont pas tous vendus, et comme des centaines de compositeurs je n'ai pas mandaté les 52 crétins pour parler à ma place, leur démarche est une provocation et une traitrise. Que les dieux de la musique leur fasse faire des fausses notes jusqu'à la fin de leurs jours - c'est pas si méchant comme mauvais sort, pour la plupart vous ne verrez pas la différence je vous l'assure !).

Une leçon du Rugby aux recruteurs d'informaticiens ?

Après avoir discuté il y a quelques temps dans un billet des leçons que les informaticiens pourraient donner aux politiques, il me semble que le match France / Nouvelle zélande qui a eu lieu hier soir sur le score de 20 à 18 pour la France pourrait bien être riche en enseignement pour tous, et pour les informaticiens en particulier.

Je m'explique. Les All-Black ont été les meilleurs, stratégiquement, techniquement, en terme de puissance physique, d'occupation du terrain, etc. C'est une évidence. La France a seulement été vaillante. Une équipe motivée constituée de bons éléments. Mais pas une équipe championne du monde, de l'aveu même de son entraîneur d'ailleurs.

Et pourtant la France a gagné le match de façon très honorable !

Cela pose problème à tous les sélectionneurs du monde, à tous les recruteurs, à tous les patrons d'équipes notamment dans notre beau métier me semble-t-il...

La norme et la mode dans notre profession est d'exiger des CV toujours plus "blindés", d'exiger une expérience sans faille plus longue parfois que l'existence des produits ou langages sur lesquels elle doit porter (je lu cent fois demander x années d'expérience sur des technos qui venaient de sortir...). Les tests d'embauche sont souvent menés par des gens qui ne pensent qu'à "coincer" le prétendant avec des questions très techniques, des bugs à trouver dans un code par exemple. Beaucoup de ces questionnaires sont basés sur le fameux "haha" c'est à dire que la réponse est évidente.. si on la connaît, et seulement dans ce cas...

Bref on veut des favoris, des tueurs, des gens capables de citer Stroustrup (et savoir l'écrire) dans le texte, et on espère qu'avec de tels candidats on pourra constituer une équipe performante, mieux : la plus performante.

L'équipe de France nous a prouvé hier soir que cette logique est absurde. On peut être dominé par des techniciens qui connaissent mieux leur fondamentaux, par des gens plus pointus techniquement, et pourtant on peut les battre avec une équipe plus faible mais inventive et très motivée...

Quand j'aurai à faire passer des entretiens d'embauche dans le futur, pour mon compte ou en tant que conseil pour mes clients, j'essayerai de me rappeler de la leçon que notre équipe de Rugby nous a donnée le soir du 6 octobre 2007...

L'informatique : l'avenir de la politique ?

Nos politiques devraient s'adjoindre les conseils d'informaticiens et de logiciens, ils feraient moins de bêtises...

En effet, seul un logicien possède le savoir et et les outils qui permettrait de mettre de l'ordre dans l'énorme base de règles que sont les lois. Notre pays compte 9000 lois et 120.000 décrets (recensement 2000) qui se contredisent et nous gouvernent, c'est un état de fait délirant. Un grand nettoyage comme le fit Napoléon avec son code éponyme est pourtant aujourd'hui à nouveau nécessaire. Peut-on faire confiance aux politiques en place pour un tel travail ? non, bien entendu.

Quant aux informaticiens ils apprendraient aux politiques que la course à la croissance est une erreur. Pendant des années les constructeurs de PC ont misé sur une vitesse de plus en plus grande des processeurs. Cette course folle s'arrête un jour, et on doit apprendre à faire toujours mieux (le progrès) mais sans forcément disposer d'éléments plus rapides. Meilleures architectures, parallèlisme (multi coeur) sont les réponses de l'informatique. Les politiques et les économistes libéraux devraient s'en inspirer et réviser leur copie.

Il faudrait alors faire comprendre aux politiques que "miser" sur des croissances de 2 à 3 % par an ne peut qu'aggraver la situation : il faudra bien un jour gérer le progrès et le bien être sans aucune croissance absolue, sauf à vouloir monopoliser toutes les ressources de la terre pour une poignée de nations, avec son lot de guerres à venir pour l'appropriation de ces ressources. Capitalisme forcené et libéralisme à l'américaine sont les cancers de nos civilisations, qui causeront notre chutte comme on s'étonne des siècles après qu'un empire comme celui de Rome ait pu un jour s'effondrer.

De même vouloir une natalité forte pour assurer le paiement des retraites est une hérésie. Ces nouveaux-nés, plus nombreux à chaque génération appellent donc encore plus de nouveaux nés dans la génération suivante pour payer leur retraite ! Comment peut-on avoir le cran de baser une politique sur ce qui est un cul-de-sac et un paradoxe logique ? Comment envoyer au mur notre pays avec des arguments aussi farfelus sans que personne ne réagisse ? Comment des gens peuvent-ils appuyer, voter, applaudir les discours d'un président qui fait le "pari" d'une croissance perpétuelle ?

Le bon sens n'est, hélas, pas la chose la mieux partagée, le philosophe se trompait lourdement.