Affichage des articles dans Sauf cross-post

Alors, prenons le prochain ticket d’incident… voilà. bla bla bla… :| mmmh. OK. Ça doit pas être bien compliqué ça devrait se trouver quelque part dans cette classe, là. Tiens, je l’ai jamais ouverte celle-là. Allons-y, Ctrl+Shift+T, OK, de quoi ça a l’air ? 8O Oh meeerde

C’est précisément l’effet « rôh merde » qu’essaie de mesurer l’outil Crap4j, via la métrique CRAP (Change Risk Analysis and Predictions), ou bien, en français, l’ohmerditude. Cette traduction en vaut une autre, et puis j’aime bien le suffixe « -itude » :D .

Ce qui me plaît dans cette métrique, c’est que, pour une fois, on part de la question avant de parler de chiffres. Je n’aime pas l’approche qui consiste à constituer des tableaux de chiffres sans fin, qui certes donnent un air très savant, mais qu’on est bien en peine d’exploiter :roll: . A travers l’ohmerditude, dans le but de vérifier qu’un code est maintenable, on essaie de répondre à la question « un développeur va-t’il trouver risqué de modifier ce code lors d’une maintenance ? ». Si oui, on prend le risque que personne ne touche plus à ce code qu’entre deux doigts, le bras tendu et en se pinçant le nez de l’autre main (voir fig. 2 ;-) ). Les développeurs vont ajouter tout autour de cette boîte noire des couches et des couches de rustines et contournements de moins en moins maintenables :cry: .

:idea: Maintenant que vous touchez du doigt tout l’intérêt potentiel de cette métrique, intéressons-nous à son calcul. La formule est un dosage pifométrique de complexité cyclomatique et de couverture de tests. En gros, un code sera « crappy » (ou « ohmerdique » si vous préférez) si il est (1) très complexe et (2) très peu testé. Un code très simple sans test ou un code complexe mais très bien testé seront considérés comme acceptables.

Crap4j mélange donc le nombre de conditions à tester avec la couverture de lignes des tests… mmmmh. :| bon, on a vu pire. Plus exactement, Crap utilise le taux de lignes non couvertes. Si l’on pose l’hypothèse que les décisions sont uniformément réparties dans les lignes de code, alors cette mesure serait une sorte d’estimation de la quantité de décisions non testées. Malheureusement je ne connais pas d’éléments qui viendraient confirmer cette hypothèse, et ça serait quand même peu fiable.

Quel usage ?

Prise en tant que métrique isolée, cette mesure ne serait pas passionnante. Par contre, je l’utiliserais comme indicateur de testabilité et de possibilité de changement. Selon l’ISO-9126, testability et changeability sont bien des sous-caractéristiques de maintainability, on est bien en élément de réponse à la question initiale. Et comme la norme laisse complètement libre la façon de calculer des indicateurs pour les sous-caractéristiques qualité (ce qui est la façon normative de dire « démerdez-vous on vous donnera pas la formule »), Crap peut être utilisé comme formule de calcul de testabilité « sur étagère », qui présente l’avantage d’être simple à expliquer, rapide à mettre en oeuvre et déjà outillée.

A condition que vous n’ayez pas déjà d’outil de mesure qualité qui vous permette de consolider différentes mesures, et à condition également de calibrer crap4j en fonction de vos exigences, celui-ci peut constituer un premier niveau d’outillage qui vous incitera peut-être à aller plus loin.

On préférera peut-être la version produisant des rapports (via ant, à intégrer à son build continu, donc) que la version plug-in eclipse : le public visé pour cet indicateur de risque qu’un changement soit non testé me semble plutôt le gestionnaire (chef de projet par exemple) que le développeur, qui va probablement garder sous les yeux dans son IDE des règles de codage plus immédiatement « actionnables ».

Mybooo (http://mybooo.com/) est un webtop, tout nouveau tout beau. Je ne vais pas vous causer technique, car ce qui me frappe chez eux, c’est plutôt l’inflation de ‘o’, qui n’est pas sans rappeler l’époque pas si lointaine de l’explosion des startups en point-com. :roll: Rappelez-vous, le double-o était de rigueur, presque une règle de la grammaire de la mercatique (on dit également marketing ;-) ) façon hiboo, genoo, choo, cailloo, poo.

Seulement, voilà, on est passé de deux ‘o’ à trois ‘o’, et ça c’est pas anodin. Un peu comme les rasoirs, quand on est passé de deux à trois lames. Et puis ça s’accélère, fatalement. Si trois lames c’est mieux que deux, alors quatre c’est forcément encore mieux. Déjà qu’à deux lames on coupait au plus près de la peau, on se demandait à quoi servait la troisième ; à cinq lames on commence à racler l’os… Dans la même veine, si le web 2.0 c’est vachement mieux que le web (implicitement 1.0), le web 3.0 (que l’on nous prédit sémantique) sera forcément vachement mieux encore. Le web 3.0 sera plein de ‘Oooooo’ lui aussi. Les startups seront toutes baptisées par le bibliothécaire de l’université de l’invisible (Oooook ;-) ).

Au buzzwordopifomètre, le web 2.0 atteint des sommets. C’est rigolo comme tout de suggérer l’idée de version, comme pour un logiciel, deux point zéro, ah ah. Est-ce que pour autant quelqu’un aura le courage de créer le premier site web 2.0.2 (Service Release 2 - build 348) (stable) ?

See yooooo soooooon.

Je n’aime pas JavaScript (sous toutes ses formes, ECMA ou ActionScript) alors je suis très chatouilleux quand on critique GWT sous l’angle « c’est quand même mieux avec <nom de son framework JavaScript favori> ». Entendons-nous bien, la panacée n’existe pas, et GWT ne l’est pas. Je trouve simplement que certains arguments entendus ou lus ici et là de la part des tenants du JavaScript sont un peu douteux :? Petite revue…

Le JavaScript généré par le compilateur GWT est incompréhensible

Je suis d’accord à 100%… mais je ne vois en quoi c’est un problème ! J’ai un aveu vous faire : j’ai fait pas mal de Java jusqu’ici, et je ne suis jamais allé lire le bytecode généré dans mon fichier .class. Honte à moi. :oops: Oserai-je l’avouer ? Je ne saurais de toute façon pas lire du bytecode. Curieusement, cela ne m’a jamais empêché d’écrire du Java… 8)

Ça revient à dire qu’il ne faut pas faire de langage C parce-que, eh bien, le langage machine qui est produit en « -O2« , on le comprend pas… Le but du compilateur est justement de générer du code que l’on a pas envie d’écrire à partir d’un langage généralement de plus haut niveau…

Oui, mais, ah aaah ! Et si le compilateur GWT a un bug ? Il faut modifier le code généré !

Je vais même aller plus loin dans votre direction : selon la bonne vieille loi de Murphy, il y a sûrement plusieurs bugs dans le compilateur GWT. Là encore, a-t-on attendu le tout dernier gcc stable pour faire du C ? Je vous mets au défi, quel que soit le langage, de trouver un compilateur qui n’ait jamais eu un bug ! Dans ce cas-là, on triture, on contourne.

Ça serait effectivement hypocrite d’affirmer qu’il n’y a pas de souci parce-que le compilateur est open-source. Qui a vraiment envie d’investir le temps nécessaire à rentrer dans le code interne d’un compilateur ? Moi pas.

La bonne question est plutôt : quel est le risque lié à un bug dans le compilateur GWT ? Voyons voir… Détecter un comportement différent entre le JavaScript généré et le Java sera probablement mis en évidence par un test unitaire (les plus paranoïaques d’entre nous pourront générer également le javascript pour les tests unitaires et les exécuter in situ dans le navigateur). Reste plus qu’à trifouiller un peu le Java jusqu’à trouver une séquence qui compile correctement (vous voyez maintenant pourquoi je vous parlais de test unitaire :twisted: ). Au pire, (r)écrivez la séquence problématique en JavaScript via JSNI. La probabilité de tomber sur un bug 100% bloquant et/ou souvent sur des bugs de compilation sévères me semble très faible et donc acceptable.

Oui, mais le JavaScript généré sera « sub-obtimal » ! Sûrement pas aussi bien que mon JavaScript finement ciselé !

Premièrement : la loi de Moore. Les navigateurs modernes sont capables d’exécuter de mieux en mieux le JavaScript. La différence supposée de performances est-elle vraiment grave ? Attention à ne pas faire d’optimisation prématurée (« la racine de tous les maux »), le javascript généré suffira-t’il à faire passer la réactivité d’un script de acceptable à non-acceptable par l’utilisateur ?

Deuxièmement, il est possible que le javascript généré par GWT sera bien plus concis :

  • Le compilateur essaie de ne conserver que le code réellement appelé. Je peux me constituer une librairie de composants GWT réutilisable entre les projets, le compilo reconnaîtra les siens. Au contraire, les frameworks JavaScripts sont pour la plupart peu modulaires.
  • Le code GWT n’ayant pas besoin d’être lu/maintenu, il subit une sorte d’obfuscation lors de la génération de JavaScript, il est bien plus compact que le JavaScript que vous allez écrire. Ou alors vous ne mettez jamais de commentaires et vos noms de fonctions et variables tiennent sur trois caractères :evil: . Dans ce cas je vous prierai de quitter ce site immédiatement. Je ne vous salue pas :P .

Oui, mais mon framework JavaScript fonctionne sur tous les navigateurs

Ça me semble au contraire la meilleures des raisons de faire du GWT : ne plus s’en occuper ! Le code généré essaie tout autant d’être multi-navigateur. A moins que le projet GWT meure, on peut supposer qu’une mise-à-jour du compilateur permettra de simplement recompiler et déployer pour que l’application soit compatible avec tout nouveau navigateur.

Alors tu rejettes en bloc toutes nos critiques ! Tu n’es pas objectif non plus !

C’est vrai, j’adore le principe de GWT :)

Mais l’implémentation, elle, est critiquable bien sûr. Les remarques pertinentes des javascripteurs sont :

  • GWT réussit à peu près bien à encapsuler le DOM, mais échoue (pour l’instant) à encapsuler CSS correctement. Il vaut mieux connaître un minimum de HTML+CSS avant de démarrer un développement GWT : Java n’y suffit pas.
  • GWT n’est pas mature. On trouve dans GWT les attributs d’une techno assez jeunes : documentation incomplète, exemples de code tenant lieu de documentation, bugs effroyables dans la librairie, les « c’est pas possible ça a jamais été testé comment ils veulent que ça marche ça ! » et les « j’ai fouillé partout je trouve trop pas la fonction pour …, c’est pas possible, ils ont jamais fait une vraie appli avec leur truc ». Bref, attendez-vous à des surprises en allant plus loin que le « bonjour, monde ». Cet effet est rattrapé en partie par la réactivité du projet, on sent d’une version à l’autre qu’il est bien piloté par les demandes de la communauté.
  • GWT n’est pas à niveau côté Java. Oui, les génériques me manquent… on y prend vite goût.

Si vous voulez voir dans quelle direction va GWT, allez lire Making GWT Better.

Bonjour, monde ! 8)