Le système de valeurs

Les développeurs de code propre ont un Système de valeurs. Il se compose des quatre valeurs décrites ci-dessous :

  • Mutabilité
  • Correction
  • Efficacité de la production
  • Amélioration continue

Table des matières

Mutabilité

Nous souhaitons commencer cette section par une thèse qui peut sembler provocante :

Il n'y a pas de maintenance logicielle !

La maintenance est un processus proactif. Dans les installations de production, les pièces sont régulièrement remplacées avant qu'elles ne soient cassées. Elles sont remplacées parce que l'expérience montre que la fiabilité tomberait en dessous d'une valeur critique si elles continuaient à fonctionner. Avant que toute l'installation ne s'arrête, les pièces critiques sont donc remplacées à temps. Chaque propriétaire de voiture sait qu'il doit faire régulièrement une vidange d'huile. Non pas parce que l'huile est épuisée à ce moment-là, ni même parce que l'huile est déjà totalement inefficace à ce moment-là. Non, elle est remplacée parce que les valeurs empiriques du fabricant montrent que le moteur est ménagé par une vidange effectuée à temps et qu'il dure donc plus longtemps.

Tout cela n'existe pas avec les logiciels. Le logiciel est tel qu'il est. La plupart du temps, il contient des erreurs. Mais ces erreurs sont aussi ce qu'elles sont. On ne peut rien faire de manière proactive pour améliorer l'état du logiciel.

Il y a bien sûr des actions pro-actives dans le fonctionnement du logiciel. Il faut peut-être vérifier régulièrement si les fichiers journaux laissent encore suffisamment d'espace libre sur le disque dur, si une base de données déborde ou si la mémoire se remplit de plus en plus. Mais le logiciel en lui-même ne peut pas être entretenu de manière proactive. Toute modification ou extension a lieu pour éliminer une erreur ou pour mettre en œuvre des exigences nouvelles ou modifiées.

Pour que des changements soient possibles, le logiciel doit avoir une structure interne qui favorise de tels changements. C'est ce que nous appelons la mutabilité. En règle générale, les logiciels sont exploités sur de longues périodes. Pendant cette période, les conditions générales changent et des fonctionnalités doivent être ajoutées. Dans l'idéal, l'implémentation d'une fonctionnalité coûte un montant fixe, indépendamment du moment où la fonctionnalité est réalisée.

Dans la pratique, le prix d'une fonctionnalité augmente au fur et à mesure qu'elle est mise en œuvre. Au début, les fonctionnalités sont bon marché, mais à la fin, il n'est même plus possible d'ajouter des fonctionnalités, car personne n'y voit plus clair. Le logiciel est jeté et redéveloppé. Jusqu'à ce que l'on arrive à ce point, les coûts augmentent de manière exponentielle. La croissance exponentielle a deux inconvénients : 1) au début, on ne se rend pas compte que les coûts augmentent. Les augmentations sont modérées. 2) Lorsque l'on se rend compte que les coûts augmentent, il est trop tard. L'augmentation est alors si rapide qu'il n'est plus possible de la contrecarrer.

Plus le logiciel peut être adapté facilement à des conditions générales modifiées, plus sa mutabilité est élevée. Mais la mutabilité ne s'obtient pas après coup. Elle doit être prise en compte dès le départ. Le logiciel doit être conçu en conséquence.

Un exemple : les classes devraient avoir une seule responsabilité. Si une classe est responsable de plus d'une chose, il est plus difficile d'en avoir une vue d'ensemble. Cela entrave les modifications, car celles-ci nécessitent de comprendre le code source qui doit être modifié. De plus, le couplage entre les classes augmente. Soudain, tout est lié à tout. Pour éviter cela, il faut que les unités fonctionnelles aient une responsabilité clairement définie et que l'on garde un œil sur le couplage. Si l'on a accumulé dans un système logiciel une série de classes qui sont chacune responsables de plusieurs choses, il est difficile de remédier à cette situation après coup. Le couplage est si important qu'il est difficile de séparer les différentes unités fonctionnelles. Si l'on veut réaliser de nouvelles fonctionnalités dans ce maquis, cela demande beaucoup de travail. Si l'on ne commence pas à temps à éclaircir le maquis, la situation s'aggrave à chaque fois. À partir d'un certain point, il n'est plus guère possible d'ajouter de nouvelles fonctionnalités. C'est le super GAU du développement logiciel.

Nous pensons qu'il n'est pas nécessaire d'en arriver là. Si l'on tient compte de la mutabilité dès le départ, les logiciels peuvent être développés sur une longue période. Les coûts par fonctionnalité peuvent augmenter légèrement au fil du temps. Mais en aucun cas de manière exponentielle !

Correction

Les logiciels doivent être corrects sur le plan fonctionnel. Un programme de comptabilité doit comptabiliser correctement les écritures, un tableur doit calculer correctement. Et les exigences non fonctionnelles doivent également être remplies. Le programme doit ménager les ressources telles que la mémoire, le temps de traitement, l'espace disque, etc. et les temps de réponse doivent se situer dans un cadre défini. Ce n'est que lorsque toutes les exigences sont remplies que le logiciel créé est correct.

Personne ne conteste la nécessité d'être correct. Mais la question est de savoir ce qui est fait concrètement pour cela. Nous pensons qu'il ne suffit pas de faire passer les logiciels, une fois qu'ils ont été créés, par un service de test dont la mission est de trouver les erreurs. Nous pensons que la correction doit être prise en compte dès le développement. Les développeurs doivent déjà se pencher sur la question de l'exactitude. Et pour qu'ils puissent le faire, il faut qu'ils sachent clairement quelles sont les exigences. Or, cela fait déjà trop souvent défaut. Les développeurs sont chargés d'implémenter une fonctionnalité sans qu'on leur dise précisément quels sont les critères d'acceptation de cette fonctionnalité. Mais il ne s'agit pas ici de jouer les Cassandre et de chercher un coupable en dehors des départements de développement. Après tout, c'est le rôle des développeurs de poser des questions en cas d'exigences peu claires, plutôt que de regarder dans leur boule de cristal.

Comparé à la construction automobile, le développement de logiciels est mal loti en matière d'exactitude. Une voiture est composée de nombreuses pièces dont l'exactitude peut être prouvée et contrôlée individuellement. Imaginez que vous deviez vous asseoir sur le capot de la voiture, un appareil de mesure à la main, pour suivre ce qui se passe dans la machine. À 200 km/h sur l'autoroute. Cela vous semble bizarre ? Dans de nombreux cas, un débogueur est utilisé exactement de la même manière. Nous pensons que c'est une erreur.

Efficacité de la production

Au final, le temps de développement et le prix du logiciel jouent bien sûr aussi un rôle. Et celui-ci est plus élevé si la production du logiciel n'est pas efficace. Cela commence par des étapes de travail manuelles qui ne sont pas automatisées et se termine par des taux d'erreur élevés qui nécessitent des retouches répétées. En fin de compte, l'efficacité de la production signifie que le logiciel peut être développé pendant des années, voire des décennies, au lieu de devoir recommencer à zéro à un moment donné. Parallèlement, une efficacité de production élevée réduit la vulnérabilité aux erreurs.

L'efficacité de la production en tant que valeur est en outre importante pour placer les autres valeurs dans un rapport de mesure. Si l'on fait des efforts infinis pour être correct, on finit par faire quelque chose de mal.

Amélioration continue

Sans rétrospective, aucun développement n'est possible. Seul celui qui réfléchit à la manière dont il a résolu un problème peut déterminer si la voie choisie était facile ou difficile. L'apprentissage est basé sur la réflexion.

Dans une science jeune comme l'informatique, il est important de toujours tenir compte des nouvelles connaissances. Pour cela, la réflexion est nécessaire à tous les niveaux. En commençant par la réflexion sur l'implémentation lors du Pair Programming ou du Code Review, la réflexion quotidienne de l'équipe, la réflexion après chaque itération, jusqu'à la réflexion de l'ensemble du secteur sur ses activités. Sans réflexion, pas de développement.

Principes et pratiques

Le système de valeurs guide les développeurs Clean Code dans leur travail quotidien. Il ne contient pas de solutions aux problèmes, mais définit des conditions cadres pour les résoudre. Les quatre valeurs sont toutefois trop abstraites pour une mise en œuvre concrète au quotidien. C'est pourquoi nous avons rassemblé des modules qui promeuvent chacun au moins une des valeurs. Nous avons divisé ces éléments concrets en deux catégories : Principes et pratiques.

Principes

Les principes de Clean Code Developer sont les lois fondamentales de la structuration des logiciels. Ils sont soit orthogonaux à d'autres cadres, soit supérieurs à ceux-ci. Le code devrait toujours être en accord avec un nombre maximal de principes. Bien sûr, ils n'ont pas le "pouvoir" des lois de la nature, que personne ne peut contredire. Mais ils sont à égalité avec eux en ce qui concerne le développement de logiciels dans leur caractère fondamental. Lorsqu'un principe n'est pas respecté, il n'y a donc pas forcément d'effet négatif immédiat, mais à court ou moyen terme, les infractions ne restent pas sans douleur. Celle-ci s'exprime par des difficultés à comprendre le code ou par des efforts importants pour introduire des modifications. Elle est ultime lorsque le logiciel ne peut plus évoluer. Il est toujours possible de voir dans le code si un principe a été respecté.

Pratiques

Les pratiques sont des techniques et des méthodes utilisées en permanence. Elles décrivent ce que les développeurs Clean Code font en pratique. Devise des pratiques : "Fais-le toujours ainsi. Tous les jours, à tout moment". Ce sont des instructions d'action concrètes qui nécessitent parfois l'utilisation d'outils. Il n'est pas toujours possible de voir dans le code si une pratique est suivie.

fr_FRFrançais