Mesure et priorisation de la dette technique

42-20714375

Si ça marche, on n'y touche pas !

Sur les projets informatiques, la maintenance et la modernisation de l'existant sont rarement prioritaires par rapport à l'ajout de fonctionnalités. Au fil du temps, le code devient moins pertinent, moins performant, plus difficile à analyser et à maintenir.
La dette technique s'accumule progressivement et freine les nouveaux développements, allonge les délais de débogage, instille l'incertitude.

Arrive le moment où l'équipe grogne et parvient à décrocher un budget pour la réduction de la dette technique. Mais comment la mesurer ? Par quel bout commencer ? Comment optimiser le budget alloué ?

Voici une méthode simple et efficace qui devrait vous permettre de prendre conscience de l'état global du projet, et de faciliter l'identification et la priorisation des portions les plus atteintes par la dette technique.

Lire la suite...

Lambdas et Underscores

Le saviez-vous ? Il est interdit d'utiliser un simple underscore (_) comme nom de paramètre de lambda. Cela a de quoi surprendre, étant donné que c'est un nom parfaitement valide pour un champ, un paramètre de méthode, ou une variable locale.

Lire la suite...

LP4J au Bordeaux JUG !

Tout d'abord, bonne année 2015 à tous et toutes !

Si vous êtes en manque de bonnes résolutions, permettez-moi de vous suggérer celles-ci, qui, à défaut de faire de vous un homme ou une femme meilleur(e), au cheveu brillant et au sourire #FFF, vous évitera au moins de finir découpé en rondelles par un collègue hystérique après un build rouge ou une mise en prod' ratée :

  • Arrêter de mettre des serialVersionUID dans toutes les classes pour faire plaisir à Eclipse ;
  • Traiter les "erreurs normales" visibles au lancement de l'application
  • Régler l'IDE en UTF8 dès le début du projet, pour ne pas vous faire appeler Martine
  • Arrêter de passer sournoisement les tests qui plantent en @Ignore
  • ... Je vous laisse compléter la liste, je suis sûr que vous avez des idées :)
Lire la suite...

Flashback : pourquoi je passe Freelance

J'ai commencé la programmation très tôt. Parce que c'était amusant.

D'abord, sur l'Apple II de mon grand-père.
Il était composé (l'ordinateur, pas le grand-père) d'une unité centrale avec clavier intégré, surplombé de deux lecteurs disquettes 5"1.4, et finalement d'un écran en noir et jaune. Une disquette (recto/verso) permettait de booter l'OS et de le monter en mémoire. D'autres disquettes permettaient ensuite de charger des programmes (tableur, jeux[1]...) et de sauvegarder les documents.

L'OS en ligne de commandes proposait quelques commandes simples, et c'est ainsi que j'ai tapé pour la première fois le traditionnel "print "hello"" et que, miracle, ça a effectivement affiché "hello". C'était magique.

Note

[1] Dont Olympic Games qui demandait de sérieusement matraquer le clavier pour faire courir les personnages

Lire la suite...

Stream.distinct(), gare à la javadoc !

L'API Stream fournit une méthode distinct() permettant d'éliminer les éléments en doublon.
Sa Javadoc indique :

Returns a stream consisting of the distinct elements (according to Object.equals(Object)) of this stream.

Cette description laisse penser qu'il suffit que nos objets implémentent equals() pour être correctement traités par distinct(), ce qui est faux (ou du moins incomplet).

Lire la suite...

Java Quiz #46 : flagada stream

Maintenant que la rage et la fureur de Devoxx sont retombées, je vous propose de résoudre un petit quiz facile sur Java 8 !

A votre avis, qu'affiche le code suivant ?

Attention, ne trichez pas : interdiction d'exécuter le code avant d'avoir trouvé ! Mais pouvez consulter la documentation de la classe IntStream.

public class Quiz {
    public static void main(String[] args) {
 
        IntStream.rangeClosed(1, 10)
                 .map(i -> i++)
                 .forEach(System.out::println);
 
    }
}
Lire la suite...

Dernières nouvelles du front : MongoDB, Android et Java8

Je profite de la relative accalmie avant le cyclone DevoxxFR pour vous expliquer à quoi j'ai été occupé en ce début d'année, et pourquoi j'ai eu moins de temps - et j'en suis désolé - pour vous proposer des billets croustillants sur ce blog. Vous allez voir, c'était le rush !

Lire la suite...

Java 8 : petit exercice pour s'échauffer le neurone à lambda

A une semaine de Devoxx France 2014 qui risque d'être riche en sessions sur Java 8 et la programmation fonctionnelle, je vous propose un petit exercice pour vous dérouiller le neurone à lambdas.

Le but du jeu est d'écrire une fonction permettant de concaténer un certain nombre de listes, passées en paramètre sous forme de var-arg :

public <T> List<T> concatLists(List<T>... lists);

Evidemment, on essaiera d'utiliser le plus possible de nouvelles fonctionnalités de Java 8 - le but est de s'amuser et de tordre un peu Java, et pas forcément de respecter les bonnes pratiques industrielles.

Allez hop, en route !

Lire la suite...

Java 8 : du neuf dans les interfaces !

java8.pngParmi les nouveautés apportées par Java 8, on en trouve deux qui concernent les interfaces : les méthodes statiques et les méthodes par défaut.

Les méthodes statiques définies sur les interfaces fonctionnent exactement de la même façon que celles portées par les classes, il n'y a donc pas grand-chose à en dire. En revanche, les méthodes par défaut risquent de modifier assez profondément notre façon de concevoir nos API.

En Java 7 et antérieur, une méthode déclarée dans une interface ne fournit pas d'implémentation. Ce n'est qu'une signature, un contrat auquel chaque classe dérivée doit se conformer en fournissant une implémentation propre.

Mais il arrive que plusieurs classes similaires souhaitent partager une même implémentation de l'interface. Dans ce cas, deux stratégies sont possibles (celui qui a dit "copier/coller" viendra me voir à la fin du billet pour une retenue) :

  • Factoriser le code commun dans une classe abstraite, mais il n'est pas toujours possible de modifier la hiérarchie des classes
  • Extraire le code commun dans une classe utilitaire, sous forme de méthode statique (ex: Collections.sort()).

On conviendra qu'aucune des deux n'est réellement satisfaisante. Heureusement, Java 8 nous offre maintenant une troisième possibilité.

Lire la suite...

NoSVN

Non, NoSVN n'est pas un nouveau mouvement qui vise à faire prendre conscience qu'il y a de meilleurs moyens de gérer son code source que ce bon vieux Subversion. Quoique.

En réalité, je voulais partager le petit script windows qui me permet de supprimer récursivement tous les répertoires .svn d'une arborescence. Pratique quand on veut copier/coller des répertoires versionnés sans risquer de provoquer des conflits tous azimuts...

Voici donc la fameuse ligne de commande, à coller dans un .bat (ou en extension de l'explorateur de fichiers pour les plus téméraires) :

for /F "usebackq" %%i in (`dir /S /B /AD *.svn`) do rmdir /S /Q %%i

Hope this helps !

- page 1 de 35