Green Coding ou comment construire des logiciels durables

1. Introduction

Thierno Diallo
Just-Tech-IT

--

Depuis plusieurs années, nous faisons face aux conséquences du changement climatique et de l’épuisement des ressources. Ce changement est très fortement lié à l’activité humaine, et aux émissions de co2 qui en découlent.

Tous les secteurs sont concernés, beaucoup de secteurs commencent à réduire leurs impacts sur l’environnement, les ressources, et la biodiversité.

Notre secteur du numérique, avec environ 4% de part mondial, contribue largement aux émissions. C’est à cet effet que des initiatives sur le GreenIT ont vu le jour. Et elles continuent de s’améliorer et produire des résultats.

Néanmoins, chaque personne de notre secteur à son niveau et dans son métier, doit prendre sa part afin de réduire l’impact de son travail sur l’environnement. En tant que Software Engineers, nous devons prendre en compte les concepts de green coding en les intégrants à notre panoplie de bonnes pratiques d’ingénierie.

C’est dans ce cadre, que je publie le premier article d’une série 7 articles, à raison d’un article par mois. Ces articles traiterons du green coding, de ses principes, et de l’application dans la vie de tous les jours.

Dans la suite de cet article, nous allons parler concrètement du green coding, comment il se définit, comment s’applique dans la pratique en nous basant sur des exemples en Java. Mais sans surprise je tiens à préciser que les principes sont indépendants d’un langage.

Avant de rentrer dans la pratique du green coding, il est important de comprendre pourquoi nous devons le mettre en place.

Nos différentes solutions d’hébergement, et de stockages consomment des quantités très importantes d’énergies et de ressources. Selon AIE en 2019 les Datacenter étaient responsable 1% de la consommation mondiale d’électricité, et ce chiffre devrait augmenter.

Avec la multiplication des produits électroniques, nous devons avoir des approches plus vertueuses et moins voraces en énergie.

greencode image

2. Les principes du Green Coding

Le Green Coding repose sur plusieurs principes qui visent tous à minimiser l’impact environnemental des logiciels que nous développons.

Nous allons discuter de quelques-uns de ces principes en ayant quelques cas pratiques pour les appliquer.

a. Efficience du code

Un code efficient est un code qui réalise la tâche demandée de la meilleure des manières, avec le moins de ressource possible. ce qui conduit automatiquement à des économies d’énergie.

Ce principe se matérialise par le fait d’écrire des algorithmes qui effectuent des tâches avec le moins d’opérations possibles. Et utilise des structures de données qui réduisent les besoins en mémoire et en cpu.

ci-après quelques exemples de code non efficace avec une proposition d’alternative:

Calcul de factoriel N

factoriel

Bien que ce code récursif soit simple, il n’est pas efficace pour des grandes valeurs de n, car il entraîne des appels de méthode excessifs et consomme beaucoup de mémoire (Usage intensif de pile)

Concaténation de chaine de caractères

stringbuilder

Lorsqu’il s’agit de chaînes volumineuses, Une concaténation de chaînes inefficace peut plomber nos performances et augmenter la consommation d’énergie. L’utilisation de la classe String Builder est plus efficace que la concaténation directe de chaînes.

Initialisation des collections (List, Arraylist etc. )

collections

Le fait de préciser la dimension de la liste au départ empêche le redimensionnement ce qui rend l’opération plus efficace.

Des boucles efficaces

Pour certaines collections, il peut être plus efficace d’utiliser les itérateurs que l’utilisation d’un for-each. Cette partie n’est pas tout le temps vrai, donc ne pas hésiter à analyser le contexte et le type de structure de données et choisir la meilleure façon.

Le Pooling d’objets

Créer et détruire fréquemment des objets est très couteux en mémoire et cpu, le Pooling d’objet peut aider à la réutilisation des objets.

b. Optimisation de l’utilisation des ressources

Les Green Codeurs optimisent l’utilisation des ressources tels que l’allocation de mémoire, la communication réseau, ainsi que les I/O fichiers. La réduction, l’optimisation, et la rationalisation des accès disques et des appels via le réseau peut réduire considérablement la consommation d’énergie.

Stream Processing

Quand on travaille avec des grands datasets, l’api Streams de java peut-être utiliser pour traiter les données de manière efficiente sans avoir à charger tout en mémoire.

Traitement concurrent et multithread

Utilisez les capacités multithreading du langage (là de Java en l’occurrence) pour effectuer des tâches simultanément, en optimisant l’utilisation des ressources du processeur.

Utilisation de Try-With-Resources

A la place d’utiliser un Try catch avec un bloc finally, il faut plutôt utiliser le Try With ressources. De cette manière nous nous assurerons que les fichiers ou connexion bdd ouvert sont correctement fermés.

c. Gestion de l’énergie

Depuis plusieurs décennies maintenant nous sommes de plus en plus conscients que le développement ne se résume pas qu’à écrire de ligne. Mais il comporte plusieurs aspects de bonnes pratiques de sécurité, maintenabilité et de performances en temps de traitements/réponses. A ceux-là s’ajoute la performance énergétique, pour cela nous devons prendre en compte la façon dont notre code tourne en production.

Parmi les techniques de gestion de l’énergie, nous pouvons citer la planification des tâches sur une période de faible demande, la mise en veille des instances quand elles ne sont pas utilisées(scale from zéro, Daily clean) aussi peut aider à réduire la consommation d’énergie.

Réduire l’activité réseau

Réduisez les communications réseau lorsqu’elles ne sont pas nécessaires, car elles peuvent consommer une quantité importante d’énergie.

Mode économie batterie

Ne pas hésiter à utiliser le mode économie de batterie pour ajuster automatiquement les paramètres en termes d’efficacité énergétique quand l’appareil est sur batterie. Les systèmes comme Android proposent cette option.

Gestion du temps CPU pour les tâches d’arrière-plan

Pour les tâches en arrière-plan qui ne nécessitent pas de traitement immédiat, vous pouvez limiter l’utilisation du processeur afin de réduire la consommation d’énergie.

d. Gestion durable des données

Ce principe consiste à la place des stratégies efficaces de stockage, et de lecture des données. Nous pouvons notamment citer comme stratégies, la déduplication et les mécanismes de mise en cache intelligents. Lors de mes prochains articles, je consacrerai un article complet sur la gestion durable de la données et sa mise en pratique.

3. Mesure et Optimisation

Le Green Coding est tout autant une philosophie et un état d’esprit, qu’une pratique qui nécessite d’être quantifiable, faisable et évaluable. Par conséquent, en tant qu’ingénieur nous devons pouvoir mesurer et surveiller la consommation d’énergie et les émissions des logiciels que nous produisons. Ces données peuvent aider à identifier les domaines à améliorer et à suivre les progrès vers un produit plus durable.

Mesurer et optimiser le code en Java implique de l’anlyser pendant le développement mais aussi de le profiler et d’améliorer les performances et l’utilisation des ressources de votre logiciel. Voici quelques exemples d’outils de mesure.

Pour l’analyse pendant le développement nous pouvons nous servir du plugin ecocode intégré dans sonarqube

Et pendant l’exécution, il y a VisualVM, Profiler API, et d’autres outils tiers de profilage.

Je consacrerai 1 article complet par outil lors de mes prochains articles.

4. Conclusion

D’un point de vue responsabilités sociales et environnementales, dans le futur nous devons prendre conscience que la pérennité des logiciels que nous produisons va dépendre leur efficience.

L’efficience va se mesurer en grande partie par la quantité de ressources de consommées, par rapport à ce que logiciel aurait dû consommées.

Il va y avoir aussi le rapport entre l’utilité/la valeur qu’apporte le logiciel, et la quantité de ressources requise pour le développer et le faire tourner.

Partant de ce constat, le rôle de green coder va devient de plus en plus important. Car il s’agit d’écrire du code tout en passant à la planète. En adoptant les principes de green coding, les développeurs peuvent réduire considérablement l’impact environnemental de leur travail, et contribuer à un avenir plus durable pour toutes et tous.

L’amélioration de la performance verte de notre secteur repose entre les mains de ceux qui créent cet écosystème, en l’occurrence nous ingénieurs (dev, Ops, qsi etc.) et tous les intervenants du numérique.

Alors en toute humilité et en procédant pas à pas à la fois vers la refondation verte de nos logiciels, codons pour un avenir vert.

Merci à François DESCAMPS et Thierry BEHIN pour la relecture et les corrections.

--

--

Thierno Diallo
Just-Tech-IT

Staff Engineer/Technical Leader And Green Champion at Axa France