/ 18.11.2024
Sommaire
TL;DR
L’efficacité est un aspect essentiel du développement de logiciels et peut être comprise dans plusieurs contextes, notamment l’efficacité algorithmique, l’utilisation des ressources et la productivité des développeurs.
La norme ISO/IEC 25010 définit l’efficacité des performances comme la capacité d’un produit à remplir ses fonctions dans des paramètres de temps et de débit spécifiés et à utiliser efficacement les ressources dans des conditions données.
Spring Framework offre plusieurs fonctionnalités qui contribuent à l’efficacité dans différents contextes :
- Java 21 et les threads virtuels : Spring Boot 3.2 prend en charge les threads virtuels de Java 21, qui sont plus légers et plus efficaces que les threads traditionnels.
- GraalVM : Prise en charge de la création d’images natives, ce qui permet de réduire considérablement le temps de démarrage et l’empreinte mémoire des applications Java.
- Piloté par les évènements : Dans les projets Spring Framework, vous pouvez fournir une sélection complète de solutions basées sur les évènements, y compris les courtiers en messagerie et le traitement en continu.
- Modèles de conception d’intégration d’entreprise : Spring Integration simplifie la messagerie au sein des applications Spring et facilite l’intégration avec des systèmes externes par le biais d’adaptateurs déclaratifs.
- Courtiers de messagerie de haut niveau : Spring fournit des outils complets pour une intégration transparente avec les systèmes de messagerie, tels que JMS, AMQP, RabbitMQ, Kafka et Pulsar.
- Traitement en continu : Les outils Spring Frameworks tels que Spring Cloud Stream simplifient la création de microservices axés sur les messages, et Spring Cloud Data Flow simplifie la construction et le déploiement de pipelines de traitement de données complexes pour le traitement en continu et par lots dans les environnements Cloud Foundry et Kubernetes.
Java et Spring Framework sont des outils populaires pour le développement d’applications dorsales, et ils sont toujours d’actualité en 2024. Cela est dû à la richesse de la documentation, aux années d’expérience en matière de production et à la pléthore d’outils open-source.
Que signifie l’efficacité dans le développement de logiciels ?
Avant d’approfondir notre compréhension de ce qui fait de Spring Framework (encore) un choix valable dans le développement moderne de backend, nous devrions commencer par quelques connaissances de base et théoriques. L’efficacité en tant que mesure de solutions créées est l’une des caractéristiques fondamentales des logiciels et des systèmes. Elle peut être comprise dans plusieurs contextes, c’est pourquoi j’aimerais mettre en évidence certains des plus importants.
Efficacité algorithmique
Mesure du temps d’exécution moyen nécessaire à un algorithme pour effectuer un travail sur un ensemble de données… Si deux algorithmes pour le même problème sont du même ordre, ils sont approximativement aussi efficaces en matière de calcul. L’efficacité algorithmique est utile pour quantifier les difficultés de mise en œuvre de certains problèmes (John Daintith et Edmund Wright : Dictionnaire de l’informatique).
Tous les développeurs ont rencontré cette définition d’une manière ou d’une autre. Nous pouvons considérer qu’il s’agit d’une utilisation optimale des ressources informatiques, définies comme le temps de calcul et l’espace mémoire. Ces deux valeurs étant difficilement comparables, la célèbre notation Big O a été créée. Elle a été créée par deux mathématiciens allemands, Paul Bachmann et Edmund Landau. Fait amusant : la lettre O est l’abréviation de German Ordnung, qui exprime l’ordre d’approximation. C’était à la fin des années 1900. Puis, en 1976, un célèbre professeur de l’université de Standford, Donald Kruth, s’est inspiré de la notation Big Omega, qui existait déjà, et l’a introduite dans l’informatique.
À partir de là, la plupart d’entre nous sont déjà familiarisés avec le tableau donné :
Ces définitions sont toujours valables et extrêmement utiles pour évaluer la complexité des problèmes dans le secteur des technologies de l’information.
ISO/IEC 25010
Jusqu’à présent, nous avons considéré le temps et l’espace comme deux valeurs cruciales pour l’évaluation de l’efficacité. Ne nous arrêtons pas en si bon chemin. Dans un article aussi informel, nous devrions au moins jeter un coup d’œil à une définition plus formelle proposée par l’Organisation internationale de normalisation, plus connue sous le nom d’ISO. Cette organisation a introduit à travers les âges plusieurs normes qui incluent l’efficacité sous une forme ou une autre, mais je me concentrerai aujourd’hui sur l’une d’entre elles qui est strictement liée au développement de logiciels :
ISO/IEC 25010:2011 et sa version révisée ISO/IEC 25010:2023.
Comme nous pouvons le voir dans cette vue d’ensemble, l’efficacité des performances joue un rôle essentiel, puisqu’elle a été établie comme l’une des 8 caractéristiques des logiciels.
Efficacité des performances : capacité d’un produit à remplir ses fonctions dans des paramètres de temps et de débit spécifiés et à utiliser efficacement les ressources dans des conditions données.
Note 1 : Les ressources peuvent être l’unité centrale, la mémoire, le stockage et les périphériques réseau.
Note 2 : Les ressources peuvent inclure d’autres produits logiciels, la configuration logicielle et matérielle du système, l’énergie et les matériaux.
(L’Organisation internationale de normalisation : ISO/IEC 25010:2023 – Modèle de qualité des produits)
Nous avons obtenu quelques perspectives et énigmes supplémentaires sur le sujet principal. Jusqu’à présent, nous disposons de définitions mathématiques et formelles, normalisées. À ce stade, je pense qu’il manque un avis du point de vue du flux de travail des ingénieurs lorsqu’ils résolvent des problèmes ou des exigences de domaine.
Ingénieur productif (efficace ?)
Avant d’aborder ce sujet plus en détail, comparons rapidement l’efficacité à la productivité fantaisiste. La productivité concerne la quantité de choses que vous pouvez accomplir, tandis que l’efficacité concerne la manière dont vous utilisez vos ressources pour accomplir vos tâches. Nous pouvons également simplifier en disant que la productivité est une question de quantité, tandis que l’efficacité est une question de qualité.
“La productivité est définie comme la quantité de travail utile effectuée au cours d’une période donnée.” (Neal Ford : Le programmeur productif, 2008)
Nous pouvons également rendre les choses un peu plus compliquées et ajouter des variables supplémentaires à notre définition.
La source: Caitlin Sadowski, Thomas Zimmermann : Repenser la productivité dans le génie logiciel
Pour atteindre notre productivité maximale, nous devons générer le plus grand rendement possible – défini comme l’efficacité par le plus petit apport, qui peut être compris comme le cout et l’efficacité de notre travail.
Être un développeur productif est un élément important de l’ensemble des compétences de l’ingénieur moderne, car il permet aux ingénieurs d’apporter plus de valeur à leurs équipes et à leurs entreprises. Lorsqu’ils sont productifs, les ingénieurs peuvent respecter les délais, améliorer la qualité et réduire les couts. Ils sont également plus susceptibles d’être satisfaits de leur travail et moins susceptibles de s’épuiser.
Voici quelques-unes des principales caractéristiques d’un développeur productif :
- Gestion efficace du temps : Savoir planifier et organiser son travail pour respecter les délais et éviter l’épuisement.
- Compétences solides en matière de résolution de problèmes : Être capable d’identifier et de résoudre les problèmes rapidement et efficacement.
- Souci du détail : Être capable de détecter et de corriger les erreurs avant qu’elles ne causent des problèmes.
- Capacité à apprendre de nouvelles choses : Être ouvert à l’apprentissage de nouvelles technologies et techniques afin de rester au fait des dernières tendances.
En développant ces compétences, les ingénieurs peuvent devenir plus productifs et contribuer davantage à leurs équipes et à leurs organisations.
L’efficacité dans le monde des projets Spring
Définition multidimensionnelle
Comme nous l’avons remarqué, la définition de l’efficacité apparait dans différents contextes. C’est pourquoi j’aimerais identifier les fonctionnalités clés du cadre et les attribuer à chaque contexte mentionné.
Native de l’informatique en nuage
- Java 21 et les threads virtuels
Les threads traditionnels de Java étaient couteux et limitaient le nombre de requêtes simultanées qu’un serveur pouvait traiter. Java 21 inclut officiellement les threads virtuels dans le JDK, qui sont plus légers et plus efficaces, permettant de créer des millions de threads sur le tas. Ils ont été créés à l’origine dans le cadre du projet Loom. Ils s’exécutent sur les mêmes threads qui leur servent de support. Cela permet aux serveurs de traiter un volume beaucoup plus important de demandes sans sacrifier les performances.
- Applications Spring MVC
Du point de vue du cadre Spring, les threads virtuels sont des threads légers qui sont idéaux pour Spring MVC parce qu’ils peuvent gérer des E/S bloquantes (E/S se réfère à Entrée/Sortie dans le monde informatique pour indiquer comment la communication se produit entre les systèmes) sans encourir l’overhead élevé des threads traditionnels. Spring MVC peut automatiquement tirer parti des threads virtuels sur les conteneurs de servlets tels que Tomcat et Jetty, sans qu’il soit nécessaire de modifier le code. Cette fonctionnalité est fournie nativement avec Spring Boot 3.2 et peut être activée par le biais de la configuration Spring basée sur le fichier application.yml. Il convient de mentionner que Spring WebFlux reste valable pour les solutions non bloquantes.
- Spring Cloud (natif)
Le développement Cloud Native met l’accent sur l’adoption des meilleures pratiques pour rationaliser la livraison des logiciels et garantir un développement axé sur la valeur. Il est basé sur des applications à 12 facteurs, où les méthodes de développement s’alignent sur les objectifs de livraison et d’exploitation en utilisant la programmation déclarative, la surveillance et la gestion. Spring Cloud prend en charge ces styles de développement en fournissant un ensemble complet de fonctionnalités qui répondent aux besoins des systèmes distribués.
Pour ceux qui ne connaissent pas Spring Cloud, il s’agit d’un ensemble d’outils qui aide les développeurs à construire des systèmes distribués rapidement et facilement. Il offre plusieurs fonctionnalités couramment utilisées dans les systèmes distribués, telles que la gestion de la configuration, la découverte de services, le routage, les appels de service à service, l’équilibrage de charge, les disjoncteurs, la messagerie distribuée, les microservices à courte durée de vie et les tests de contrats dirigés par le consommateur et le producteur.
Spring Cloud fonctionne bien dans n’importe quel environnement d’application d’entreprise distribuée, y compris les ordinateurs portables des développeurs, les centres de données bare-metal et les plateformes gérées comme Cloud Foundry ou Kubernetes. Le second a été largement plébiscité ces dernières années, car il fournit aux développeurs un cadre distribué évolutif qui gère les clusters et les applications, ce qui en fait un excellent choix pour les charges de travail qui s’étendent sur plusieurs environnements cloud. Cette flexibilité profite aux développeurs qui peuvent déployer des applications sur différentes plateformes cloud.
- GraalVM – un JDK avancé avec compilation d’images natives à l’avance
Spring Boot 3.0 a introduit le support natif de GraalVM, qui a remplacé le projet Spring Native du développeur précédent. Cela a apporté d’énormes avantages en termes de réduction des ressources utilisées. Les applications Java compilées à l’avance par GraalVM nécessitent moins de mémoire et de CPU pour fonctionner. GraalVM permet de déployer des conteneurs légers qui démarrent en quelques millisecondes, ce qui est nettement plus rapide que les conteneurs JVM traditionnels. Cette réduction du temps de démarrage et de l’empreinte mémoire optimise l’infrastructure des applications et permet d’atteindre immédiatement des performances maximales. Elle suit également de près les nouvelles fonctionnalités de Java, notamment les threads virtuels, ce qui permet d’accéder immédiatement aux dernières avancées.
Naturellement, il y a aussi quelques inconvénients puisque pendant la compilation à l’avance (AOT), il supprime simplement le code qui n’est pas nécessaire. Les principaux compromis sont les suivants :
- La compilation des images natives prend des minutes au lieu de quelques secondes. Cela peut représenter un surcout important par rapport à la JVM, qui peut compiler les classes Java en quelques secondes.
- Il nécessite des métadonnées supplémentaires pour gérer correctement la réflexion, les proxies et d’autres comportements dynamiques de la JVM. Ces métadonnées peuvent être générées automatiquement par le projet Spring, mais elles peuvent ne pas être complètes pour tous les projets.
- La combinaison des transformations Spring AOT et de l’image native de GraalVM nous oblige à geler le classpath et les conditions des beans au moment de la construction. Cela signifie que vous ne pouvez pas changer le classpath ou les conditions des beans au moment de l’exécution. Ceci doit être pris en considération, car le conteneur Spring ne sera pas en mesure de refléter tous les changements dans son contexte.
- Restauration du point de contrôle de la JVM
CRaC est un projet OpenJDK qui fournit une nouvelle API Java pour les opérations de point de contrôle et de restauration sur la JVM HotSpot. Il s’appuie sur le projet CRIU pour la fonctionnalité de point de contrôle/restauration sous Linux. Il vous permet de vérifier votre JVM en cours d’exécution, y compris sa mémoire et son état, sur le disque et de la restaurer plus tard, éventuellement sur une machine différente. Cela peut être utile pour sauvegarder et restaurer l’état de l’application et améliorer les performances du démarrage à froid.
Le projet CRaC est encore en cours de développement, mais il a déjà été adopté par AWS Lambda et IBM OpenLiberty. Il s’agit d’une technologie prometteuse qui peut rendre les applications JVM plus efficaces et résilientes.
Axé sur les évènements
Les systèmes évènementiels s’alignent sur le paysage en constante évolution des entreprises modernes, où de nombreuses modifications mineures interviennent en permanence. La capacité de Spring à gérer et à utiliser les évènements permet aux développeurs de construire des applications qui reflètent cette nature dynamique, en gardant les applications synchronisées avec les opérations de l’entreprise. Le framework Spring comprend une sélection complète de solutions basées sur les évènements, couvrant l’intégration, le streaming, les fonctions cloud et les fonctionnalités de flux de données.
- Modèles d’intégration dans les applications d’entreprise
Avec un projet dédié, Spring Integration, Spring permet d’utiliser des modèles populaires et bien établis basés sur des modèles de conception d’entreprise. Il simplifie la messagerie au sein des applications Web et facilite l’intégration avec des systèmes externes par le biais d’adaptateurs déclaratifs, qui rationalisent la prise en charge existante de Spring pour la messagerie et la planification à distance. Il vise à fournir une approche simple pour construire des solutions d’intégration d’entreprise tout en maintenant la séparation des préoccupations, l’inversion du contrôle et l’injection de dépendances, qui sont des concepts essentiels pour créer un code maintenable et testable et également pour éviter un couplage étroit.
Au-delà de la connexion de composants à granularité fine, il fournit une collection complète d’adaptateurs de canaux et de passerelles pour communiquer avec des systèmes externes. Les adaptateurs de canaux gèrent l’intégration unidirectionnelle (envoi ou réception), tandis que les passerelles facilitent les interactions demande/réponse (à la fois entrantes et sortantes).
- Courtiers en messagerie de haut niveau
Les architectures logicielles modernes reposent sur des systèmes distribués, dans lesquels les courtiers en messagerie sont essentiels pour faciliter la communication entre des services disparates. Java Message Service, RabbitMQ, Kafka et ActiveMQ sont des courtiers de messagerie largement adoptés, chacun offrant des caractéristiques distinctes adaptées à des applications spécifiques.
Le Spring Framework fournit des outils complets pour une intégration transparente avec les systèmes de messagerie, depuis l’interaction simplifiée avec l’API JMS grâce à JmsTemplate jusqu’à un cadre complet pour la gestion des échanges de messages asynchrones. Spring AMQP offre un ensemble de fonctionnalités similaires adaptées à la messagerie basée sur AMQP. Il simplifie encore la connectivité en proposant des options d’autoconfiguration pour RabbitTemplate et RabbitMQ. Spring WebSocket s’intègre de manière transparente à la messagerie STOMP, et Spring étend ce support avec des starters et une autoconfiguration minimale. En outre, il prend en charge l’intégration d’Apache Kafka et d’Apache Pulsar.
- Traitement en continu
Spring Cloud Stream simplifie la création de microservices axés sur les messages, en s’appuyant sur Spring Boot pour générer des applications Spring autonomes de niveau production. Il s’intègre de manière transparente à Spring Integration pour établir des connexions avec des courtiers de messagerie, offrant des options de configuration indépendantes des fournisseurs tout en introduisant les concepts de sémantique persistante de publication et d’abonnement, de groupes de consommateurs et de partitions.
Les principaux éléments constitutifs de Spring Cloud Stream sont les suivants :
- Relieurs de destination : les connecteurs chargés d’établir la communication avec les systèmes de messagerie externes.
- Liaisons de destination : les intermédiaires qui relient les systèmes de messagerie externes au code de l’application développée, qu’il s’agisse de producteurs ou de consommateurs.
- Message : le format de données normalisé utilisé par les producteurs et les consommateurs pour interagir avec les classeurs de destination, permettant la communication avec d’autres applications par le biais de systèmes de messagerie externes.
En plus de cela, il y a aussi Spring Cloud Data Flow qui simplifie la construction et le déploiement de pipelines de traitement de données complexes pour le streaming et le traitement par lots dans les environnements Cloud Foundry et Kubernetes. Il s’agit d’une boite à outils permettant de créer des pipelines de données à l’aide d’applications Spring Boot, en s’appuyant sur les frameworks de microservices Spring Cloud Stream et Spring Cloud Task déjà mentionnés. Les cas d’utilisation du traitement des données pris en charge par Spring Cloud Data Flow comprennent l’ETL, l’import/export, le streaming d’évènements et l’analyse prédictive.
L’avenir de Java en 2024
Nous sommes en 2024, et oui, Java ne va nulle part. C’est toujours un langage de programmation extrêmement populaire. Dans une enquête menée par JetBrains à la fin de 2023, intitulée The State of Developer Ecosystem, auprès de 26 348 développeurs du monde entier, 49 % d’entre eux ont déclaré avoir utilisé Java au cours des 12 derniers mois. En comparaison, le plus populaire, JavaScript, a été utilisé par 61 % d’entre eux. En outre, pas moins de 33 % déclarent qu’il s’agit du principal langage qu’ils utilisent, ce qui représente le pourcentage le plus élevé de cette enquête. N’oublions pas que la famille JVM comprend également Kotlin et Scala, entre autres, qui sont très populaires. Le premier est plus pertinent dans notre contexte, car il peut être utilisé à partir de 2017 dans le cadre Spring à partir de la version 5.0.
Spring Boot reste populaire
Quant au framework principal de l’article d’aujourd’hui, Spring Boot, selon une enquête sur stackoverflow.com, jouit de l’approbation de près de 14% des professionnels interrogés, ce qui en fait le 6e framework backend le plus populaire et le premier basé sur la JVM.
En outre, sur la base des dépôts publics créés sur github.com, le nombre de projets établis en 2023 est supérieur à 106 000. À titre de comparaison, pour node.js (qui a été le mieux classé dans l’enquête mentionnée sur stackoverflow.com), il est de plus de 107 000.
Java et Spring Framework sont toujours des outils très populaires dans le monde des applications d’entreprise. Cette popularité s’explique par une documentation abondante, des années d’expérience en production et de nombreux outils open-source. Spring Boot est toujours activement développé et, tout en conservant un statut d’opinion, il est beaucoup plus facile de suivre les modèles de conception et d’architecture recommandés.
Communauté Java
Le nombre de projets établis en 2023 est supérieur à 106 000. À titre de comparaison, pour node.js (qui a été le mieux classé dans l’enquête mentionnée sur stackoverflow.com), il est de plus de 107 000.
Java et Spring Framework sont toujours des outils très populaires dans le monde des applications d’entreprise. Cette popularité s’explique par une documentation abondante, des années d’expérience en production et de nombreux outils open-source. Spring Boot est toujours activement développé et, tout en conservant un statut d’opinion, il est beaucoup plus facile de suivre les modèles de conception et d’architecture recommandés.
Résumé
L’efficacité est un concept essentiel dans le développement de logiciels, qui englobe divers aspects tels que la performance algorithmique, l’utilisation des ressources et la productivité des développeurs. La norme ISO/IEC 25010 définit l’efficacité des performances comme la capacité d’un produit à exécuter ses fonctions dans des paramètres de temps et de débit spécifiés, tout en optimisant la consommation des ressources.
L’efficacité des performances est assurée par les threads virtuels Java 21, des alternatives plus légères aux threads traditionnels qui réduisent les frais généraux d’exécution. En outre, les images natives de GraalVM permettent un démarrage plus rapide des applications et une empreinte mémoire réduite.
Le développement évèénementiel est facilité par l’écosystème complet de Spring, qui comprend Spring Integration, des courtiers de messagerie et des capacités de traitement en continu. Il simplifie la messagerie au sein des applications et facilite l’intégration avec des systèmes externes par le biais d’adaptateurs déclaratifs. Un large éventail de courtiers de messagerie, dont JMS, AMQP, RabbitMQ, Kafka et Pulsar, estKliknij tutaj, aby wprowadzić tekst. pris en charge. Spring Cloud Stream simplifie la création de microservices axés sur les messages, tandis que Spring Cloud Data Flow rationalise les pipelines de traitement de données complexes pour le streaming et le traitement par lots dans les environnements Cloud Foundry et Kubernetes.
La popularité durable de Java se traduit par son adoption continue par les développeurs, comme le montrent les enquêtes et les référentiels de projets. La popularité de Spring Boot est également significative, se classant au sixième rang des frameworks backend et au premier rang des frameworks basés sur la JVM. Sa riche documentation, son expérience de production étendue et la pléthore de frameworks Web open-source contribuent à son attrait durable.
En conclusion, Spring Boot et Java offrent une suite complète de fonctionnalités qui améliorent l’efficacité dans diverses dimensions du développement logiciel. De l’optimisation des performances algorithmiques aux architectures pilotées par les évènements et jusqu’aux modèles d’intégration d’entreprise, Spring Boot fournit une base solide pour construire des applications Java modernes, évolutives et efficaces. La pertinence continue de Java et la popularité de Spring Boot soulignent les mérites de ces technologies dans le paysage contemporain du développement logiciel.
J’espère que vous avez apprécié cet aperçu de l’efficacité dans le développement de logiciels et les fonctionnalités que Spring Boot et Java offrent pour améliorer l’efficacité. Merci de m’avoir lu ! Restez à l’écoute et découvrez bientôt d’autres contenus liés à Java et Spring World.
Restez en sécurité et bonne codification.
Références
- Łukasz Bielarczyk : Significations et interprétations de l’efficacité dans les normes ISO ; 2022
- Maddy Osman : Productivité vs. efficacité : Comment améliorer les deux au travail,2023
- Neal Ford : Le programmeur productif, 2008
- Caitlin Sadowski, Thomas Zimmermann : Repenser la productivité dans le génie logiciel, 2019